Problem mit fwrite()



  • Splieth@School schrieb:

    Ändert aber nichts an meiner Erklärung... fwrite will die Adresse an der die Daten stehen, nicht die Adresse des Zeigers, der auf diese Daten zeigt! Dessen Adresse liegt ja (ganz) wo anderes :p

    das stimmt schon aber fwrite, wandelt diese daten automatisch um 😉 das meine ich damit, und somit ist es wurscht was ich dem fwrite übergebe.



  • Mag ja sein, dass es einige Compiler so handhaben, was ich ja auch gar net bestreitet habe. Nur kannst du ja nicht Blind davon ausgehen, dass dies bei jedem geschieht und laut Referenzen findet nunmal keine automatische Umwandlung statt; ergo: gleich vernünftig übergeben! 😉



  • Splieth@School schrieb:

    Mag ja sein, dass es einige Compiler so handhaben, was ich ja auch gar net bestreitet habe. Nur kannst du ja nicht Blind davon ausgehen, dass dies bei jedem geschieht und laut Referenzen findet nunmal keine automatische Umwandlung statt; ergo: gleich vernünftig übergeben! 😉

    funktioniert auch beim Borland Turbo C++ 3.xx und der ist schon sehr happig was solche sachen betrifft und auch schon sau alt, insofern kann ich davon ausgehen das jeder NEUE compiler dieses auch automatisch erkennt und sollte er es nicht erkennen muss ich es ändern.



  • Nein, kannst du nicht! Wenn etaws nicht genormt ist kannst du nicht einfach davon ausgehen, dass die "Funktion" bei jedem Compiler implementiert ist! Nur weil ein altes Auto ABS hat kann du ja auch nicht davon ausgehen, dass auch jedes neue über dieses tolle Gimmick verfügt...;) Wenn dein Prof was anderes sagt: erschlagen! 😉



  • Splieth@School schrieb:

    Nein, kannst du nicht! Wenn etaws nicht genormt ist kannst du nicht einfach davon ausgehen, dass die "Funktion" bei jedem Compiler implementiert ist! Nur weil ein altes Auto ABS hat kann du ja auch nicht davon ausgehen, dass auch jedes neue über dieses tolle Gimmick verfügt...;) Wenn dein Prof was anderes sagt: erschlagen! 😉

    ich denke dass ich aufjedenfall davon ausgehen kann wenn die 2 größten ide's es unterstützen dass der Rest mehr oder weniger nachzieht, mag sein das es im ansi-c nicht standardisiert wird, aber funktionieren tut es trotzdem und wenns funzt dann funzt und dann werde ich es nicht ändern nur weil es dann unter umständen auf einem system nicht funktioniert für das es nicht gemacht ist.



  • Du bringst genau die Eigenschaften mit die ein Programmierer haben sollte...
    Wenn du meinst, einen gut gemeinten Rat nicht annehmen zu müssen, dann bitte! Wenn man sich aber schon in einem Forum rumtreibt und nach verbesserungsvorschlägen sucht sollte man diese auch wahrnehmen; darum geht es hier schließlich und wenn du dir mal den Aufbau von fwrite anguckst wirst du auch schnell merken warum du nicht Recht hast..



  • @Splieth@School:

    ganz meine meinung. --
    ich bewundere deine ausdauer... keep it up.
    gruß, oli



  • Hirogen(CD) schrieb:

    Splieth@School schrieb:

    Hirogen(CD) schrieb:

    das & ist dem .net Studio relativ egal

    Eigentlich nicht; es ja ein unterschied ist ob du die Adresse übergeben willst, die in dem Pointer steht oder die Adresse des Pointers selbst...:)
    Sowas kann eigentlich nicht mal MS bringen ^^

    probiers im .net aus, es war meinem .net egal, ob ich &b oder b geschrieben habe.

    Und ich kann mir auch gut vorstellen warum.

    wenn ich &b schreib übergebe ich ja die Adresse mit und wenn ich b schreib übergebe ich auch die Adresse mit da ja "bei einem Pointer immer die Adresse übergeben wird."

    zitat meines C/C++ Prof.

    So ein Schmarrn!

    Das & ist nur unnötig, wenn du eine Referenz hast. Bei einem Zeiger ist es aber ein riesiger Unterschied!

    Probier das hier mal aus, dann siehst du was ich meine:

    #include <stdio.h>
    
    int main(void)
    {
       int * zeiger;
       int wert = 5;
    
       zeiger = &wert;
    
       printf("Wert: %d\n", *zeiger);
       printf("Adresse von Wert: %d\n", zeiger);
       printf("Adresse von Zeiger: %d\n", &zeiger);
    
       return(0);
    }
    


  • Endlich mal jemand der hier tacheles redet! 😉



  • seit mir nicht böse, aber wenn ich es im .net und im borland builder schreiben kann werde ich dieses nicht ändern nur weil ihr andere compiler oder ides benutzt bei denen es nicht funktioniert, mag sein dass ich mal probs damit hab, ja schön dann werd ich es ändern aber solange es funktioniert und dieses tut es werde ich es 100% nicht ändern, ich habe mir deine ratschlag zu herzen genommen und es mir gemerkt, ABER ich lass mir nicht vorschreiben wie ich was benutzen soll nur weil mir irgendeiner mit irgendwelchen normen kommt, es FUNKTIONIERT unter .net und unter Borland Builder somit ist es für mich gegebn dass ich es auch so weiterhin schreiben kann, da ich nur auf einen dieser ide's bzw. compilern programmier, ob das im ansi-c jetzt anders is oder nicht is mir egal.



  • Das hat nichts mit Normen zu tun du Pansen, sondern einfach damit, was AJ dir versucht hat zu erklären... Und sowas will studiert sein... 👎



  • rewind(datei); //Filepointer zurück stellen auf Anfang des Files
    if(b) //Wenn speicher alloziert wurde
    {
    rewind(datei); //Sicherheitshalber nochmal an den Datei anfang gehen

    Ernsthafte Dinge ignorierst Du, aber an der Stelle baust Du eine total überflüssige 'Sicherheit' ein.

    Übrigens:
    Printf geht auch nur zufällig gut. Ohne Flushen der Ausgabe ist es nicht zwingend, dass die Daten zum Zeitpunkt des getch() wirklich im Bildschirm stehen.

    Ich will gar nicht weiter ins Detail gehen, aber jene 25 oder die 15 hätten auch schöne DEFINEs verdient. Wobei Du für gleichzeitige Anpassung von scanf("%25s",... mal in die Tiefen des Präprozessors einsteigen kannst... 😉

    wenn die 2 größten ide's es unterstützen

    Ob das die Größten sind, ist wohl eine subjektive Ansicht.
    IDE hat mit Compiler auch nichts zu tun.



  • Hmmm... Also wenn du meinst, mit deiner Einstellung ein versierter Programmierer werden zu können solst du natürlich hier nicht aufgehalten werden :p
    Mach was du willst 🙂



  • Bitsy schrieb:

    rewind(datei); //Filepointer zurück stellen auf Anfang des Files
    if(b) //Wenn speicher alloziert wurde
    {
    rewind(datei); //Sicherheitshalber nochmal an den Datei anfang gehen

    Ernsthafte Dinge ignorierst Du, aber an der Stelle baust Du eine total überflüssige 'Sicherheit' ein.

    Übrigens:
    Printf geht auch nur zufällig gut. Ohne Flushen der Ausgabe ist es nicht zwingend, dass die Daten zum Zeitpunkt des getch() wirklich im Bildschirm stehen.

    Ich will gar nicht weiter ins Detail gehen, aber jene 25 oder die 15 hätten auch schöne DEFINEs verdient. Wobei Du für gleichzeitige Anpassung von scanf("%25s",... mal in die Tiefen des Präprozessors einsteigen kannst... 😉

    wenn die 2 größten ide's es unterstützen

    Ob das die Größten sind, ist wohl eine subjektive Ansicht.
    IDE hat mit Compiler auch nichts zu tun.

    das war die alte version in der neuen ist sehr wohl ein fflush() drinnen.

    jedoch das mit den 25 defines ist mir nicht klar 😉



  • Splieth@School schrieb:

    Hmmm... Also wenn du meinst, mit deiner Einstellung ein versierter Programmierer werden zu können solst du natürlich hier nicht aufgehalten werden :p
    Mach was du willst 🙂

    ich will in c/c++ bei gott kein versierter programmierer werden, dafür ist mir das ganze einfach zu umfangreich und zu langwierig es zu lernen, mir reichen voll und ganz oberflächliche dinge, ich konzentriert mich eher auf andere dinge, ich mach auch nur c/c++ weil mir nix anderes übrig bleibt.



  • Hirogen(CD) schrieb:

    Splieth@School schrieb:

    Hmmm... Also wenn du meinst, mit deiner Einstellung ein versierter Programmierer werden zu können solst du natürlich hier nicht aufgehalten werden :p
    Mach was du willst 🙂

    ich will in c/c++ bei gott kein versierter programmierer werden, dafür ist mir das ganze einfach zu umfangreich und zu langwierig es zu lernen, mir reichen voll und ganz oberflächliche dinge, ich konzentriert mich eher auf andere dinge, ich mach auch nur c/c++ weil mir nix anderes übrig bleibt.

    Das ist mal 'ne Aussage. Sich unter diesen Voraussetzungen dann hier zu registrieren ist doch eher lobenswert, find' ich.
    Das Problem ist nur - C/C++ oberflächlich ist ein Widerspruch in sich.
    (Dafür ist doch Java da, oder?)
    Wenn Du im Forum stöberst, da haben wir schon ellenlange Diskussionen über winzige Details geführt. Deshalb kannst Du Ratschlägen (wie z.B. speziell von AJ) auch bedingungslos trauen. Klar - noch kannst Du Gutwillige von Trollen nicht unterscheiden... Deshalb - Ball flach halten.

    Nochmal zum Define:
    Konstanten, die an mehreren Stellen auftauchen - und vielleicht sogar irgendwann mal geändert werden sollen - definiert man besser mit einem Synonym um. Hat auch was mit Fehlerredundanz zu tun.
    In die Bredouille kommst Du dann aber eben mit der 25 im scanf-String.
    Da ist ein Stringliteral angesagt (und das habe ich bis heute auch so selten gebraucht, dass ich da erstmal wieder nachsehen müßte, wie es richtig verwendet wird :p ).



  • Hirogen(CD) schrieb:

    das & ist dem .net Studio relativ egal, es interessiert sich nicht dafür, zum einen deshalb weil eine Adresse drin steht, und somit so und so eine Adresse übergeben wird, richtigkeits halber gehört aber das & weg und das hab ich auch getan.

    Doch es interessiert sich dafür. Deine Erklärung ist auch für die Füße, weil ein Zeiger selbstverständlich nicht nur eine Adresse IST, sondern auch eine (davon verschiedene) Adresse HAT. Hast du mal beide Versionen ausprobiert und die resultierenden Dateien extern überprüft?

    Ich hab zwar dein Programm nicht testen können, weil es unvollständig ist, aber folgendes Minimalbeispiel gibt im VS.NET nicht das gewünschte in die Datei aus:

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    
    struct BUCH
    {
        char titel[40];
    	float preis;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	BUCH* b = (BUCH*)malloc(sizeof(BUCH));
    	strcpy(b->titel, "Industrielle Bildverarbeitung");
    	b->preis=10.0f;
    
    	FILE *f = fopen("buch.dat", "wb");
    	rewind(f);
    	fwrite(&b, 1, sizeof(BUCH), f);
    	fclose(f);
    	return 0;
    }
    

    (will heißen, der Titelstring ist nicht in der Datei enthalten, nur Müll)

    Das ist natürlich kein Wunder, wie oben gesagt. Wenn es bei dir anders ist, würd ich mich doch sehr wundern und dir nahelegen, dass du mal versuchst herauszufinden, warum das so ist.



  • Das haben Splieth@School und AJ ja nun auch schon außreichend erlkärt, wenn mans net verstehen will... 🙄



  • Hirogen(CD) schrieb:

    seit mir nicht böse, aber wenn ich es im .net und im borland builder schreiben kann werde ich dieses nicht ändern nur weil ihr andere compiler oder ides benutzt bei denen es nicht funktioniert, mag sein dass ich mal probs damit hab, ja schön dann werd ich es ändern aber solange es funktioniert und dieses tut es werde ich es 100% nicht ändern, ich habe mir deine ratschlag zu herzen genommen und es mir gemerkt, ABER ich lass mir nicht vorschreiben wie ich was benutzen soll nur weil mir irgendeiner mit irgendwelchen normen kommt, es FUNKTIONIERT unter .net und unter Borland Builder somit ist es für mich gegebn dass ich es auch so weiterhin schreiben kann, da ich nur auf einen dieser ide's bzw. compilern programmier, ob das im ansi-c jetzt anders is oder nicht is mir egal.

    Ich bin dir nicht böse, aber ich möchte dich drauf hinweisen, dass du was falsch machst. Möglicherweise funktioniert das Programm so, auch bei anderen Compilern. Aber manchmal braucht es dann nur eine kleine Änderung oder eine andere Konfiguration am Computer bzw. es laufen andere Programme als sonst und du bekommst einfach nur noch Müll raus.

    Hast du mein Beispiel mal ausprobiert?

    Sollte es übrigens tatsächlich so sein, dass bei deinen beiden Compilern es keinen Unterschied macht, ob du & oder kein & verwendest (d. h. bei meinem Beispielprogramm kommt für zeiger und für &zeiger genau das gleiche raus), dann solltest du dich beim Hersteller beschweren, dass sie absolut fehlerhafte Programme ausliefern!


Anmelden zum Antworten