Arraygröße aus Dateiangabe initialisieren



  • TTP schrieb:

    hey, ich bin anfänger, eig war meine frage nur, ob´s möglich ist... weil ich mir nich ausmalen konnte, ob sowas überhaupt funktioniert

    kein problem, irgendwie bekommt man alles hin.
    btw. mein code von da oben^^ ist übrigens ziemlicher mist. zeigt zwar das prinzip, aber es sind viele bugs drin. z.b. kann man den speicher nicht free'n, weil die pointerliste hinten ist.
    🙂



  • hmm, dann frag ich ma direkt:
    mit welchem Code setzt ich das denn jetzt ab besten um? ich hab jetzt die version die "tausend" mal allokiert und free't



  • Kommt auf die Größe des Arrays und deine Anforderungen an. Wenn du unbedingt mit array[x][y] auf die Daten zugreifen möchtest, dann würde ich im Moment noch mit der "klassichen" Methode arbeiten, sonst würde ich auf jedenfall mit pointercrash()s "flattening" Methode arbeiten. Weiterhin ist die Frage, ob du dein Array oft in der Größe ändern mußt. Das würde dann wieder für die Klassische Methode sprechen, da realloc den Inhalt der alten Speicherbereiche mit in die neuen Speicherberieche übernimmt. Mit pointercrash()s Methode müßtest du die Werte manuell wieder richtig anordnen. Und ~frickys Ansatz funzt aber ist eher ein Hack.

    Kommt also drauf an!



  • also eigentlich muss ich die größe nur aus einer datei auslesen und dann verwenden. Wärend das programm läuft, wird die größe nicht mehr geändert. die größe wird einmalig bei programm-erststart festgelegt und dann als fix betrachtet 🙂

    Edit:
    die größe beschränkt sich wahrscheinlich auf unter 100 spalten sowie zeilen. Speicherver(sch)wendung sollte da egal sein...

    2nd Edit:
    Anforderung ist eig. nur das es Funktioniert. Wie ist eig. egal und RAM sollten die Testmaschinen auch mehr als genug für das Programm haben



  • NDEBUG schrieb:

    Und ~frickys Ansatz funzt aber ist eher ein Hack.

    das hier funzt wirklich, stürzt nicht ab, ist kein hack, 'free' geht, usw:
    (aber vielleicht findet ihr ja doch noch'n fehler)

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef long TYPE;
    
    TYPE **PointerList (int width, int height)
    {
        int s;  
        TYPE *p, **pp;    
    
        pp = malloc (width * (height * sizeof(TYPE) + sizeof(TYPE*)));
        if (0 == pp)
            return 0;
    
        p = (TYPE*)((char*)pp + width * sizeof(TYPE*));
    
        for (s=0; s<width; s++)
            pp[s] = p + s * height;
    
        return pp;
    }
    
    #define AX 3
    #define AY 109
    
    int main()
    {
        int s,l;
        TYPE **pp = PointerList (AX, AY);
        if (0 == pp)
        {
            puts ("f*ck!!!");
            exit (0);
        }
    
        for (s=0; s<AX; s++)
            for (l=0; l<AY; l++)
                pp[s][l] = s+l*AX;
    
        for (s=0; s<AX; s++)
        {
            for (l=0; l<AY; l++)
                printf ("%03d ", pp[s][l]);
            puts ("");
        }
    
        free (pp);
    }
    

    übrigens muss ich meine zweifel an der geschichte etwas relativieren: die pointerlisten-methode hat den vorteil, dass sie eventuell schneller ist, als 'echte' 2d-arrays, weil keine multiplikationen benötigt werden.
    🙂



  • wofür steht typedef long TYPE; ?

    ich möcht ja keine zahlen speichern sondern mein struct "objekt" dann muss ich das TYPE ändern in objekt oder?

    Sry, bin gerad etwas verwirrt...
    Sprech ich das ding dann auch über pp[x][y] an oder wie?



  • ^^richtig. angenommen du hast eine struct:

    struct mystruct
    {
      int a;
      double b;
    };
    

    dann machste einfach:

    typedef struct mystruct TYPE;
    

    ...und es sollte funzen.
    🙂



  • okay, ich probier es gleich aus...
    nochmal ne zwischen frage:

    ich hab mein projekt in mehrere header-dateien verteilt. Daher nutz ich die main() nur um die initailiserungs aufrufe der header aufzurufen.

    jetzt hab ich gerad so n bisschen das problem, dass ich nicht weiß wie ich das mit dem allokieren und dem free'n machen soll.

    ich hab jetzt die funktion speicher_allokieren() und speicher_freigeben() aber ich kann den zeiger der auf den speicher zeigt ja nicht global deklaieren, da die variable ja erst vom programm gesetzt werden muss (also höhe und breite)

    wahrscheinlich sinnvoll das allokieren und das freen doch in den main() zu schieben oder?

    Ich muss ja aus anderen Funktionen auch noch auf den Array zugreifen könn



  • [cpp]typedef int TYPE;
    TYPE **PointerList (int width, int height)
    {
    int s;
    TYPE *p, **pp;

    pp = malloc (width * (height * sizeof(TYPE) + sizeof(TYPE)));*
    if (0 == pp)
    return 0;

    p = (TYPE*)((char*)pp + width * sizeof(TYPE*));

    for (s=0; s<width; s++)
    pp[s] = p + s * height;

    return pp;
    } [/cpp]

    Fehlermeldung:
    *error C2440: '=' : cannot convert from 'void *' to 'TYPE *'
    wieso void? ich versteh die Fehlermeldung gar nicht, langsam verzweifel ich ein bisschen...



  • TTP schrieb:

    *error C2440: '=' : cannot convert from 'void *' to 'TYPE *'
    wieso void? ich versteh die Fehlermeldung gar nicht, langsam verzweifel ich ein bisschen...

    du musst es als C compilieren, nicht als C++. C++ kennt den 'void*' (z.b. den typ des rückgabewerts von malloc) nur vom namen her, kann aber nicht damit umgehen. benenn' deinen quellcode in .c (nicht .cpp) um, dann sollte es klappen.
    🙂



  • wie mach ich das? ich benutz visual studio 2008, da gibt´s irgendwie kein nur C-Projekt... 😢
    kay, habs in den einstellungen doch gefunden...

    EDIT: Wenn ich das im Compiler umstelle, dann kennt er bool nicth mehr 😞
    und ich bekomm noch viel mehr errors -.-

    error C2016: C requires that a struct or union has at least one member
    error C2275: 'TYPE' : illegal use of this type as an expression
    error C2065: 'pp' : undeclared identifier
    error C2100: illegal indirection
    error C2065: 'pp' : undeclared identifier
    error C2065: 'pp' : undeclared identifier
    warning C4022: 'free' : pointer mismatch for actual parameter 1

    kann ich mir den typ bool irgendwie selbst definieren mit true/false?



  • TTP schrieb:

    also eigentlich muss ich die größe nur aus einer datei auslesen und dann verwenden. Wärend das programm läuft, wird die größe nicht mehr geändert. die größe wird einmalig bei programm-erststart festgelegt und dann als fix betrachtet 🙂
    Edit:
    die größe beschränkt sich wahrscheinlich auf unter 100 spalten sowie zeilen. Speicherver(sch)wendung sollte da egal sein...
    2nd Edit:
    Anforderung ist eig. nur das es Funktioniert. Wie ist eig. egal und RAM sollten die Testmaschinen auch mehr als genug für das Programm haben

    Du magst dann direkt bei Corel einsteigen? Unsitten, die man sich angewöhnt hat, legt man später schwer wieder ab, bin da selbst nicht frei von Sünden. Aber die klassische Methode zerfällt in so viele Einzelaufrufe, das läuft nicht performant. malloc() kostet Rechenzeit und das nicht zu wenig!!! Wenn Du zur Laufzeit feststellen kannst, was Du brauchen wirst und nicht Resizen mußt, nimm' den Speicher am Stück und zerteil' ihn Dir selber.

    ~fricky schrieb:

    übrigens muss ich meine zweifel an der geschichte etwas relativieren: die pointerlisten-methode hat den vorteil, dass sie eventuell schneller ist, als 'echte' 2d-arrays, weil keine multiplikationen benötigt werden.
    🙂

    Kommt echt drauf an. Tausend mallocs und frees wollen erstmal eingeholt sein. Was ich gerade direkt benchen kann, hängt das stark vom Prozessor ab. Bei dem einen ist die Derefereinzierung so flott, das geht ein bisserl schneller als zu multiplizieren (6 Zyklen). Beim anderen, der das im RAM nachbasteln muß, geht die Multiplikation deutlich schneller.
    Dann noch, wieviel man auf dem Array rumrödelt usw.

    Aber das ist ja nicht der Gurkenfaktor, vielleicht wenn man subsummierend sagt, daß malloc() und free() das System auf eine "Reise ins ich" schickt, die unterschiedlich lange dauern kann mit Betonung auf "lange". "Vermeiden Du sollst es, wenn Du nicht wirklich brauchen es", würde Yoda wohl sagen. 😉



  • TTP schrieb:

    wie mach ich das? ich benutz visual studio 2008, da gibt´s irgendwie kein nur C-Projekt... 😢
    kay, habs in den einstellungen doch gefunden...

    Warum tust Du Dir das an? Wenn Du was in C machen magst, nimm' einen C- Compiler.
    Jetzt sind es nämlich VStudio- Fragen und die haben hier nichts zu suchen.
    Sagt Dir das grob was?:

    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    // Function- Header
    // ....
    
    #ifdef __cplusplus
    }
    #endif
    

    So sperre ich beim VS2003 in gemischten Projekten puren C- Code ein. Weiß nicht, wie das beim aktuellen geht.



  • selbst damit bekomm ich den fehler 😞
    error C2440: '=' : cannot convert from 'void *' to 'TYPE **'
    habs auch eben auf nem anderen rechner mit VS2003 probiert, da kommt das gleiche Output wie bei 2008...

    Nachtrag:
    Wenn ich in VS2008 n neues Projekt anlege und dann im Compiler einstelle, er soll´s als C compilieren, dann gehts. Mach ich es mit C++ und füge den Tag ein, macht er mir den Error 😞



  • TTP schrieb:

    Wenn ich in VS2008 n neues Projekt anlege und dann im Compiler einstelle, er soll´s als C compilieren, dann gehts.

    Dann mach's doch so!

    TTP schrieb:

    Mach ich es mit C++ und füge den Tag ein, macht er mir den Error 😞

    Brauchst Du C++? Sind die anderen Fehler wenigstens weg? Die Liste war ja recht konkret.

    Ich hab' grade frickys letztes Machwerk compiliert, keine Gemotze, daran kann's nicht liegen.



  • Also wenn ich das umstelle in C compilieren, dann gehts in nem neuen Projekt. Wenn ich das bei meinem vorhanden umstelle, dann bekomm ich ne lange liste fehler. Ich hab jetzt schon bool überall in int geändert.

    Trotzdem bekomm ich beim code oft diesen Fehler:

    error C2143: syntax error : missing ';' before 'type'

    Das witzige ist:

    typedef int TYPE; 
    
    TYPE **PointerList (int width, int height) 
    { 
        int s;   
        TYPE *p, **pp;     
    
        pp = malloc (width * (height * sizeof(TYPE) + sizeof(TYPE*))); 
        if (0 == pp) 
            return 0; 
    
        p = (TYPE*)((char*)pp + width * sizeof(TYPE*)); 
    
        for (s=0; s<width; s++) 
            pp[s] = p + s * height; 
    
        return pp; 
    } 
    
    int nix()
    {
    	return 0;
    }
    
    int main() 
    { 
    	nix();
    
    	int x = 4;
    	int y = 5;
        int s,l; 
        TYPE **pp = PointerList (x, y); 
        if (0 == pp) 
        { 
            puts ("f*ck!!!"); 
            exit (0); 
        } 
    
        for (s=0; s<x; s++) 
            for (l=0; l<y; l++) 
                pp[s][l] = s+l*x; 
    	pp[0][0]= 34;
    
        for (s=0; s<x; s++) 
        { 
            for (l=0; l<y; l++) 
                printf ("%03d ", pp[s][l]); 
            puts (""); 
        } 
    
    	system("PAUSE");
        free (pp); 
    }
    

    lasse ich

    nix();
    

    weg, dann geht es und er meckert nicht... hääää? woran liegt das, das is bei allen funktionen so...

    Edit: Hat das vielleicht was mit TYPE zu tun? wenn ich den aufruf nach dem krams mache geht´s aber ich muss ja vorher in meiner main() erstmal die variablen auslesen -.-

    Okay Nachtrag (so geht´s)

    nix();
    

    ändern in

    int u = nix();
    

    dann gehts komischerweise... mach ich aber aus nix den typ void oder so, dann läufts wieder nicht... ???



  • TTP schrieb:

    Also wenn ich das umstelle in C compilieren, dann gehts in nem neuen Projekt. ...
    Trotzdem bekomm ich beim code oft diesen Fehler:

    error C2143: syntax error : missing ';' before 'type'

    Mit Zeilenbezug wär's leichter ...
    Aber lies' doch erstmal die Fehlermeldung! Vermutlich mag er die Reihenfolge nicht. Früher waren die Regeln unheimlich streng und heute verwirrend lax. Ein Funktionsaufruf VOR allen Variablendeklarationen, glaube nicht, daß das auch heute so durchgeht.



  • also das bezieht sich auf die Zeile in der Nix() steht,
    wie gesagt, schreib ich nix(); geht gar nix und er gibt mir diese fehler aus, initalisiere ich aber eine neue variable mit der funktion, dann geht es komischerweise... also aller int tmp = nix();

    Visual Studio fehler?

    PS: Fällt eigentlich irgendjemandem auf, dass ich so gut wie jeden Beitrag nochmal editiere? 😃



  • TTP schrieb:

    PS: Fällt eigentlich irgendjemandem auf, dass ich so gut wie jeden Beitrag nochmal editiere? 😃

    Ne, mir fällt auf, daß Du nicht liest. Der Aufruf nix() hat da nichts zu suchen. Daß Du damit einen int initialisieren kannst, bitteschön.
    Aber warum willst Du den da unbedingt einstereuen? Ist doch sinnlos ...



  • in meinem quelltext stand nicht mehr drin, wo soll da der fehler sein?

    // nix();
    

    Resultat: Keine Fehlermeldung alles läuft

    nix();
    

    Resultat: Der genannte Fehler

    int tmp nix();
    

    Resultat: Workaround was komischerweise läuft?

    Erklär mir da bitte mal wo das woanders dran liegen soll, das versteh ich nicht.


Anmelden zum Antworten