Arraygröße aus Dateiangabe initialisieren
-
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.
-
TTP schrieb:
Resultat: Der genannte Fehler
int tmp nix();
Resultat: Workaround was komischerweise läuft?
Bitte verschiebe Dein nix() mal hinter Zeile 33, da sollte es nicht stören.
-
naja wenn ich das verschiebe, dann macht es nicht so viel sinn, weil eigentlich soll die funktion aus einer datei meine variablen auslesen
deswegen bleibt mir ja nur das workaround oder?
Aber du hast recht, wenn ich mein nix() danach mache, meckert nichts
-
TTP schrieb:
naja wenn ich das verschiebe, dann macht es nicht so viel sinn...
bei den vor-c99 compilern müssen variablen immer am anfang einer funktion angelegt werden, also bevor 'aktiver' code hingeschrieben wird (deswegen zickt dein compiler bei dem funktionsaufruf rum). schiebste den funktionsaufruf einfach dahinter, das hat keine nachteile oder sowas.
so etwa:
int main() { int x = 4; int y = 5; int s,l; TYPE **pp; nix(); pp = PointerList (.... ....
-
Das geht so eigentlich nicht. Zuerst werden die Variablen angelegt, wenn Du sie danach mittels einer Funktion befüllen magst, gibt es kein Problem.
Nur kannst Du nicht eine Funktion, die einen int zurückliefert, mit einem davorgeschriebenen Irgendwas künstlich ruhigstellen.Also
int meinwert // alle anderen Variablen anlegen meinwert = nix(); andererwert = etwas(); // ... // Initialisierung fertig // Der Code, der was tun soll: LetsDoSomeThing(meinwert, deinwert, adererwert);
Also nicht Deklarationen und ausführbaren Code wüst mischen, das sind Exkursionen in die Chaos- und Duselzone, woll'n 'mer doch nicht!
-
~fricky schrieb:
TTP schrieb:
naja wenn ich das verschiebe, dann macht es nicht so viel sinn...
bei den vor-c99 compilern müssen variablen immer am anfang einer funktion angelegt werden, also bevor 'aktiver' code hingeschrieben wird (deswegen zickt dein compiler bei dem funktionsaufruf rum). schiebste den funktionsaufruf einfach dahinter, das hat keine nachteile oder sowas.
pointercrash() schrieb:
Das geht so eigentlich nicht. Zuerst werden die Variablen angelegt, wenn Du sie danach mittels einer Funktion befüllen magst, gibt es kein Problem.
Nur kannst Du nicht eine Funktion, die einen int zurückliefert, mit einem davorgeschriebenen Irgendwas künstlich ruhigstellen.Ähm die Funktion soll meine X und meine Y Variable bestimmen, dann muss die doch davor kommen
und mit dem Workaround erreich ich das zum Glück.
Dann hab ich damit wohl den Compiler ausgetrickst
-
TTP schrieb:
Ähm die Funktion soll meine X und meine Y Variable bestimmen, dann muss die doch davor kommen
klar, zuerst legst du die variablen an, dann rufste deine funktion auf, die ihnen werte gibt und alles andere kann danach kommen.
-
ich bekomm es nicht hin
ich muss doch da global drauf zugreifen....
Ich verzweifel gerad....typedef long TYP; TYP **PointerList (int width, int height) { int s; TYP *p, **pp; pp = malloc (width * (height * sizeof(TYP) + sizeof(TYP*))); if (0 == pp) return 0; p = (TYP*)((char*)pp + width * sizeof(TYP*)); for (s=0; s<width; s++) pp[s] = p + s * height; return pp; }; int main(void) { int tmp1 = systemvariablen(); int tmp2 = struktur(); int tmp3 = erststart(); TYP **pp = PointerList(lagerflaeche_breite, lagerflaeche_laenge); if (0 == pp) { lagerarray_fehler(); } lagerflaeche(); free (pp); system("PAUSE"); return 0; }
jetzt will ich in lagerflaeche auf pp zugreifen, geht aber nicht -.-
muss ich da den pointer übergeben? wie mach ich das richtig?
einfachlagerflaeche(**pp);
und in lagerfläche dann
void lagerflaeche(TYP **pp) {
}
oder wie? ich glaub langsam werd ich blöde bei dem thema...
EDIT: HILFE....
-
vor den main() kann ich das TYP **pp = PointerList(lagerflaeche_breite, lagerflaeche_laenge); ja nicht schreiben, da die variablen lagerfläche_breite und _länge ja nicht gesetzt sind o.O
-
~fricky schrieb:
TTP schrieb:
Ähm die Funktion soll meine X und meine Y Variable bestimmen, dann muss die doch davor kommen
klar, zuerst legst du die variablen an, dann rufste deine funktion auf, die ihnen werte gibt und alles andere kann danach kommen.
magst du mir nochmal ne hilfestellung dazu geben?
-
so aufrufen:
lagerflaeche (pp);
und so drauf zugreifen:
void lagerflaeche (TYPE **pp) { pp[...][...] = irgendwas; ... }
^^vielleicht noch länge und breite mit an 'lagerflaeche' übergeben, oder das ganze in eine separate struct packen.
ach, noch was: in dieser PointerList-funktion könntest du die zeile:
p = (TYPE*)((char*)pp + width * sizeof(TYPE*));
gegen:
p = (TYPE*)pp + width;
austauschen.
^^macht das gleiche, sieht nur nicht mehr so doof aus.
-
juhu, geht... DANKE
oh man da soll man drauf kommen...
so mal gucken ob ich die zugriffe jetzt auch richtig hinbekomme....Ähm die größe muss ich nicht übergeben, hab ja die globalen variablen lagerflaeche_breite, lagerflaeche_laenge auf die ich nur zugreifen kann
Vielen Dank das ihr euch so viel Mühe macht mir das beizubiegen
-
jetzt muss ich das doch einmal realloc'en.
typedef long TYP; TYP **PointerList (int width, int height) { int s; TYP *p, **pp; pp = malloc (width * (height * sizeof(TYP) + sizeof(TYP*))); if (0 == pp) return 0; p = (TYP*)((char*)pp + width * sizeof(TYP*)); for (s=0; s<width; s++) pp[s] = p + s * height; return pp; }; int main(void) { int tmp1 = systemvariablen(); int tmp2 = struktur(); int tmp3 = erststart(); TYP **pp = PointerList(lagerflaeche_breite, lagerflaeche_laenge); if (0 == pp) { lagerarray_fehler(); } lagerflaeche(); free (pp); system("PAUSE"); return 0; } function repp(int height, int width) { }
ich will es erst auf die größe 1x1 festlegen und dann später nochmal auf die richtige größe ändern, damit ich das workaround wegbekomme.
Die ZeileTYP **pp = PointerList(1,1);
ist mein 1. Schritt.
Wie muss ich die repp aufbauen? da muss ich doch bestimmt dann PointerList als zeiger übergeben oder?geht das so einfach?
function repp(int height, int width, *pp) { int s; pp = realloc (width * (height * sizeof(TYP) + sizeof(TYP*))); if (0 == pp) return 0; p = (TYP*)((char*)pp + width * sizeof(TYP*)); for (s=0; s<width; s++) pp[s] = p + s * height; }
-
^^nee, du müsstest eine neue pointerlist aufbauen, alles aus der alten rüberkopieren und die alte dann free'n. was besseres fällt mir jedenfalls gerade nicht ein. wahrscheinlich ist es sinnvoller, 'ne einfache, verkettete liste zubenutzen. sowas ist flexibler als diese doofe pointerliste (deren einziger zweck es ist, mit p[][] drauf zuzugreifen).
-
wie mach ich denn ne neue?
TYP **pp = PointerList(lagerflaeche_breite, lagerflaeche_laenge); .. free(pp); pp = PointerList(neuebreite, neuelaenge);
geht das so? hab´s jetzt gerad nicht getestet..