Arraygröße aus Dateiangabe initialisieren
-
^^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 1kann 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 habenDu 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.
-
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.