Beiträge von sommeralex

    Zitat von west

    der pointer selber gehoert noch dir. der referenzierte bereich aber nicht mehr und kann dir vom OS jederzeit weggenommen werden, d.h. man produziert nicht in allen faellen eine speicherverletzung. (manche OS räumen erst auf, wenn der platz benötigt wird. manche sofort. voodoo.)



    danke - jetzt ist es klar! es wird qasi als "gelöscht markiert" ok. jetzt ist aber immer noch meine frage offen:

    wenn ein struct X auf andere structs Y zeigt, und ich dieses struct X mit free(struct X) anschreibe, werden dann auch meine structs Y "gelöscht"/free - obwohl noch andere zeiger auf diese zeigen?

    aber wie lösche ich nun "nur" die zeiger? (ohne die objekte zu löschen, auf die sie zeigen)

    struct x{

    }

    x *pointer_auf_x;

    struct y{

    x * pointer_auf_x;

    }

    y *pointer_auf_y;

    jetzt hab ich zwei listen, meine mutterliste aus einer einfach verketteten liste auf x. und eine kindliste, eine liste auf y.

    die frage ist, wenn ich jetzt ein element aus der mutterliste lösche, was passiert mit meiner liste aus y? oder umgekehrt: was passiert, wenn ich bsp. free(pointer_auf_y) mache? -> wird dann auch das objekt meiner mutterliste gelöscht?

    Hallo!

    Ich muss gestehen, ich bin kein C Profi. Daher quält mich folgendes Problem:

    ich habe zwei Pointer Listen, welche mir "quasi" auf die selben Objekte x zeigen. eine "Mutterliste", sie zeigt direkt auf alle Objekte x. Und eine "Kindliste", sie zeigt nur auf einige Objekte meiner Mutterliste, doch sie zeigt nicht auf diese Objekte im eigentlichen sinne (direkt), sondern nur indirekt auf ein struct (und dieses struct zeigt direkt auf ein Objekt x).

    was passiert nun, wenn ich ein objekt von meiner Mutterliste gelöscht habe - wohin zeigt der Pointer meiner Kindliste, welche ursprünglich auf dieses Objekt gezeigt hat? Frage1. Frage2: muss ich diesen Pointer meiner Kindliste nicht auch über "free" loslösen? und wenn, versucht es dann auch, dass objekt x zu "löschen" (aus dem heap)

    hm.. vielleicht ist es auch nur spät..

    danke, alex

    bist du dir sicher, dass keine leerzeichen berücksichtigt werden? schau mal unter regex nach, wie die definition eines leerzeichens ist. vielleicht fängst du es nicht richtig ein? als string geht ja " " aber ob ein char auch ' ' ist, bin ich mir nicht sicher.

    vielleicht sollte ich mir als wirtschaftsinformatiker doch mal algodat2 reinziehen ;) mach ich im sommer! vielen dank plantsch, ist nicht das erste mal, dass du mir weiterhilfst.

    als du lex-ordnung erwähnt hast, hats bei mir geklingelt. ich sah den wald vor lauter bäumen nicht.

    danke.

    Zuerst einmal wünsche ich einen schönen Feiertag! ;) Und bedanke mich an all jene, die sich die Zeit nehmen, mir zu helfen.

    Ich möchte eine verlinkte Liste sortieren. Dabei ist aber die Art der Sortierung eine spezielle. Oder sogar, dynamische.

    struct element{

    int mainkey; //mk
    int subkey; /sk

    struct element *next;

    };

    Prinzipiell sollten alle Elemente nach mainkey sortiert werden, aber nur dann, wenn alle subkeys gleich sind. sind sie es nicht, sollen alle subkeys in teilgruppen eingeteilt werden, und diese gruppen dann nach mainkey sortiert. Daher ist es ein Sortieralgorithmus, welcher mit Mengen arbeitet.

    mk1 = 1, sk1 = 0, mk2 = 2, sk2 = 0, mk3 = 3, sk3 = 0
    mk4 = 4, sk4 = 0, mk5 = 5, sk5 = 0

    sortierung:

    mk1, mk2, mk3, mk4, mk5 (ok) - normaler sort-algo.

    nun:

    mk1 = 1, sk1 = 5, mk2 = 2, sk2 = 1, mk3 = 7, sk3 = 1
    mk4 = 4, sk4 = 4, mk5 = 5, sk5 = 4

    sortierung sollte so aussehen:

    mk2, mk3, mk4, mk5, mk1

    die liste wird erst zur laufzeit erstellt. vermutlich ist es einfacher, in die bereits sortierte liste einzufügen. sollte es aber einen algo für dieses problem geben, wäre es sehr interessant zu sehen, wie er aufgebaut ist. selbstverständlich kann es auch mehrere subkeys geben.. möchte mich aber zuerst mal auf einen beschränken..

    vielleicht kennt sich jemand sehr gut mit sortieralgorithmen aus.. und kennt ein einfaches pattern.

    meine adhoc lösung: teile die liste in teilgruppen (=suche nach subkeys, füge sie in partitionen, laufzeit ist aber dann n^2) sortiere teilgruppen (laufzeit je nach algo) und füge teilgruppen in sk reihenfolge wieder zusammen.

    lg alex

    Hallo!

    Wie hier einige vielleicht wissen oder auch nicht kämpfe ich schon seit längerem mit meinem Projekt http://www.learnclip.com. Es handelt sich um einen "witzigen Lernwecker". Eine taiwan. Firma hat sich dieser Idee angenommen und mir bis Dato auch schon €2500 für die Entwicklung als "echte Hardware" abgezapft. Genaugenommen soll es auf einem 8051 Chip realisiert werden. Es ist auch alles vertraglich geregelt, aber irgendwie kommt mir manchmal so einiges sehr spanisch vor. Unter anderem folgendes:

    1) ich hab dieses von mir erstellte Programm. Es compiliert und arbeitet unter gängigen C Compilern perfekt. Wenn es - laut Aussage des taiw. Programmierers unter der C8051 Programmierumgebung "KEIL" verwendet wird, gibt es ein Speicherleseproblem, originalzitat:

    Meine 1.Frage "when does this error occur?"
    Antwort: no error,c51 compiler is ok,but memory(head_book->config->val->iterations[0].year; ) always "0x00" ,

    Meine 2. Frage "Does this problem only reflect on 8051?"
    Antwort: Yes, My C51 compiler is OK, but read memory "0x00" (Pelles C compiler is OK,read memory OK.)"

    Ein Screenshot (von ihm für mich) gibts auf http://www.learnclip.com/LC_Help.pdf

    -> leider kann ich es selbst nicht testen, weil die derzeitige herunterladbare aktuelle evaluation version fehlerhaft ist. nur eine ältere, die ich im internet finden konnte, funktioniert geht aber wieder nicht mit seiner Projekt datei...(versionskonflikt)

    Nun, meine Frage:

    Die Fragen, die sie mir stellen, sind doch ziemlich hardwarenahe.

    1) Kann / soll ich das überhaupt wissen können? Ich meine: ich studiere im 7. Semester WINF, nicht techn. Informatik. (und das wissen die)

    2) Was könnte das für ein Fehler sein, "read memory" unter Pelles C (oder anderen win C compilern ok, - aber unter Keil passiert nichts.. außer 0x00?)

    3) dieser Fehler kann nur ein Bug sein, ich meine, ein Intel ist ja auch nur ein Chip, und bei mir am Laptop (oder bei ihm am PC) funkionierts.

    Mein Lösungsansatz für ihn: Er soll eine andere Umgebung probieren, den Support von Keil kontaktieren, oder in seiner Firma tätige Programmierer fragen. Außerdem - die Erfahrung hab ich zumindest gemacht - gibt es manchmal bei "langen Zeigerschlangen" Probleme wie sie bei head_book->config->val->iterations[0].year auftreten. Daher der Rat für ihn: Das kürzen dieser langen Pointerzeiger Schlange. Erfahrungsgemäß gibt es da manchmal Probleme. also statt

    head_book->config->val->iterations[0].year

    lieber:

    struct config *temp_config;

    temp_config = head_book->config;

    und jetzt, tataa:

    temp_config->val->iterations[0].year

    (im bzw auf val anwenden)

    Aber mein Code ist wirklich nicht "der Aufwand" (kann ihn auch gerne private posten) Immerhin programmiert/erstellt diese Firma echte Mp3 Player und Netzwerkkarten. Da ist doch meine Software ein Klax.
    Andererseits haben sie mir auch schon angebobten, das Projekt zu canceln, weil sie befürchten das ich mit deren Leistung unzufrieden bin. (was nicht stimmt - aber manchmal könnte ich explodieren wie sich die anstellen) oder sie tun nur so.. http://www.bright-computech.com.tw/ naja...

    hm...

    vielen dank für jede überlegung über diesen sachverhalt.

    Hallo, diesesmal bin ich wirklich sehr, sehr verzweifelt..

    ich hab ein struct u *unit; (eine unit hat zwei zeitstempel)

    also:

    struct u{

    time_t geburt;
    time_t tod;

    };


    dann hab ich über eine dyn. verkettete liste structs u erzeugt (malloc) und belege geburt und tod mit zeitpunkten dieser dyn. erzeugten units.

    dann hab ich mir eine methode geschrieben, welche mir ein struct u (unit) ausgibt. und das sieht so aus:

    time_t geburt = unit->geburt;
    struct tm *p_geburt;
    p_geburt = localtime(&geburt);
    printf("born time:....... %s",asctime (p_geburt));

    time_t tod = unit->tod;
    struct tm *p_tod;
    p_tod = localtime(&tod);
    printf("death time:....... %s",asctime (p_tod));

    und die zeiten werden RICHTIG ausgegeben.. wenn ich aber NUR meinen CODE NEU ANORDNE:

    time_t geburt = unit->geburt;
    struct tm *p_geburt;
    p_geburt = localtime(&geburt);
    time_t tod = unit->tod;
    struct tm *p_tod;
    p_tod = localtime(&tod);


    printf("born time:....... %s",asctime (p_geburt));
    printf("death time:....... %s",asctime (p_tod));

    ...haben plötzlich BEIDE printf ausgaben die zeit von "tod"...

    ??????????????????????????????

    danke! das problem der pointer ist ja nicht, dass mir diese dynamische speicherallozierung nicht klar wäre. es geht darum, dass ich nicht weiß/wusste, ob, wenn speicher alloziiert wird, dies nur für das objekt geschieht, auf das gezeigt wird (also ob speicher nur für das objekt reserviert wird) ODER auch für den POINTER. ein pointer besteht ja selbst aus einer adresse und einer adresse, auf die er verweist.

    nun dachte ich, wenn ich das objekt über free() freigebe, ich auch den pointer freigeben muss.

    aber anscheinend geht es hier nur um adressen ;)

    -> wenn ich also ein objekt dyn. erzeuge, hab ich seine adresse. diese adresse kann ich jetzt beliebig über funktionen mit pointern weiter (bzw zurückgeben) - OHNE das ich meine neuen pointer mit malloc iniitieren muss. da sie alle schon auf das das eine objekt zeigen.

    -> und damit wirklich nichts schief geht, übergebe ich einfach bei unterschiedlichen pointern NUR die adresse auf das OBJEKT, NICHT die adresse der pointer. (weil die ja, wenn sie nicht über malloc erzeugt werden) nach der funktion ihren geist aufgeben..

    richtig?

    reparieren? vielleicht sollte ich meine frage einfach verbal beschreiben:

    in einer funktion bekomme ich einen dynamischen zeiger als rückgabewert. dieser zeiger zeigt eben auf das dynamisch erzeugte objekt. ich muss es dynamisch erzeugen, da er ja sonst, nach dem ende der funktion, nicht mehr vernünftig existieren würde (außer im stack)

    in einer zweiten funktion rufe ich meine erste funktion auf, "übernehme" den zeiger und will ihn jetzt aus der funktion 2 zurückgeben. müsste ich dann icht auch zusätzlich ein dynamisches objekt erzeugen (malloc zeiger) welcher auf das selbe objekt wie der zeiger der funktion eins zeigt?

    Hallo!

    Wenn ich ein struct Y habe, welches selbst wieder einen Zeiger x enthält, welches auf ein globales objekt zeigt, und dieses struct Y dynamisch erzeuge, und später wieder lösche (free) - muss ich dann:

    1) meinen zeiger x auch dynamisch erzeugen?
    2) wenn ja, warum? weil ich doch dann keine möglichkeit mehr hätte, diesen zeiger über free loszuwerden. da er auch das globale objekt zeigt, welches ich erhalten möchte.

    (danke..)

    Hallo!

    Wenn ich eine funktion1 habe, welche mir einen zeiger zurückgibt.. (welcher in der funktion1 dynamisch erzeugt wurde...) und ich nun diese funktion in einer funktion2 aufrufe, welche diesen zurückgibt, muss ich dann den zeiger speicherplatz der funktion1 freigeben? oder bin ich total am falschen weg? malloc erstellt doch eine variable, die über die funktion, hinaus lebt. wenn ich nun einen zeiger deklariere, über malloc, wird doch sowohl für das objekt auf das gezeigt wird, speicher reserviert, als auch dem zeiger selbst, welcher auf dieses objekt zeigt.

    funktion 1;

    int * funktion1(){

    int * rückgabewert1;
    rückgabewert1 = malloc(sizeof(int);

    int = blablabla;

    return int;
    }

    int * funktion2(){


    int * rückgabewert2;
    rückgabewert2 = malloc(sizeof(int);


    rückgabewert2 = (int*) funktion1();

    return funktion2;

    }

    frage: was ist mit dem zeiger der funktion1? der lebt doch noch, aber zugreifen könnte man nicht mehr..oder?

    bei mir hat ein book struct einen zeiger auf config. config hat variablen. nun möchte ich über eine methode die variabeln von config des book structs ändern. mein erster, naiver ansatz war folgender:


    void set_book(struct b *book, struct c *config){

    book->config = config;

    }

    aber, da ja dann der pointer auf das neue, übergebene objekt zeigt, müsste ich das alte zuerst zerstören (free) - ichhoffe, dass stimmt soweit (?)

    daher ist das besser:

    void set_book(struct b *book, struct c *config){

    free(book->config)
    book->config = config;

    }

    und dann dachte ich, das sollte auch gehen, geht aber nicht:

    void set_book(struct b *book, struct c *config){

    book->config.locked_mode = config->locked_mode;
    book->config.limit = config->limit;
    book->config.val = book->config->val;

    }

    warum kann ich in der letzten variante meiner methode nicht einfach die werte kopieren? (danke..)

    ..jetzt kenn ich mich aus.. (ich wills nicht verschrein) ;)

    ->das heisst, wenn ich in meiner funktion zwei pointer deklariere, beispielsweise so:

    pointer A = {Parameter} [explizit OHNE malloc]
    pointer B = [explizit MIT malloc]

    und dann B = A mache
    und B als Wert der Funktion zurückgebe,

    GEHT DAS AUCH NICHT - ich hoffe, diese analogie ist richtig.

    vielen dank für deine hilfe!

    jetzt hab ich sicherheitshalber meine funktion mit malloc erzeugt.

    ------- code kann 1:1 übernommen/compiliert werden -------

    struct c{

    /*2c*/ float limit;
    /*3c*/ short alarm_mode;
    /*4c*/ short locked_mode;

    };

    struct c *create_config(float limit, short alarm_mode, short locked_mode){

    //
    struct c *poi;
    struct c config = {limit, alarm_mode, locked_mode};
    poi = (struct c *)malloc(sizeof(struct c));
    poi = &config;

    return poi;
    }


    int main(void){

    struct c *p_config = create_config(2.3, 2, 78);

    short lm = p_config->locked_mode;
    printf("%d\n", lm);

    lm = p_config->locked_mode;
    printf("%d\n", lm);

    lm = p_config->locked_mode;
    printf("%d\n", lm);

    return 0;
    };


    ------- code ende -------

    aber das SCHLIMME IST FOLGENDES:
    die ausgabe ist beim ersten printf 78 (richtig)
    die ausgabe beim zweiten printf wird 18

    wie kann das sei?

    Hallo ;) - lasst euch von den paramtern nicht abschrecken, darum gehts hier nämlich nicht..

    struct c *create_config(interval * val, float limit, short alarm_mode, short locked_mode){

    struct c config = {val, limit, alarm_mode, locked_mode};
    return &config;
    }

    int main(){

    struct c *p_config = create_config(val_1, 2.3, 2, 3);


    short lm = p_config->locked_mode;
    printf("%d", lm);

    }

    ich dachte, wenn ich variabeln/structs während der laufzeit initialisiere, benötige ich malloc. dennoch liefert mein programm die richtige zahl, nämlich 3.

    noch eine frage:

    wenn ich in java auf ein objekt zeige, existiert es, solange ich darauf zeige. wenn ich in C auf ein objekt zeige, und meinen zeiger de-referenziere, existiert das objekt weiter (obwohl ich nicht mehr darauf zugreifen kann) um es vom speicher zu entfernen, muss ich zuerst free() anwenden - stimmt das?

    hallo, hoffentlich kann mir hier wieder jemand helfen, manchmal passieren unglaubliche dinge, von denen ich glaube, dass sie nur mir passieren:

    ich hab ein header file. in diesem deklariere ich zwei structs: original header file:

    ----start interval.h ----


    /*
    defining an iteration depending on the repetition value
    */

    struct iter {

    int sec;
    int min;
    int hour;
    int day;
    int month;
    int year;

    };
    typedef struct iter iteration;


    struct inter {

    iteration iterations[10];

    };
    typedef struct inter interval;
    leerteile
    leerteile

    ----ende interval.h ----

    manchmal hat der compiler alles tadellos akzeptiert.. aber manchmal kam unten stehende fehlermeldung, bis ich durch "zufall" draufkam, dass ich noch ein paar "leerzeilen" nach "typedef struct inter interval" einzurücken hatte. wenn ich nach dem semikolon "..inter interval;" auf "entfernen drücke, um sicherzustellen, dass keine leerzeilen existieren, und mein projekt neubilde, ("rebuild all files" in Pelles C) erscheint die Fehlermeldung.

    Verwende ich einen "schlechten" Compiler oder ist das ein Bug?

    F:\Programme\PellesC\Projects\LC2005\interval.h(24): error #2156: Unrecognized declaration.
    F:\Programme\PellesC\Projects\LC2005\interval.h(24): warning #2176: Unrecognized character escape sequence '\\P'.
    F:\Programme\PellesC\Projects\LC2005\interval.h(24): warning #2176: Unrecognized character escape sequence '\\P'.
    F:\Programme\PellesC\Projects\LC2005\interval.h(24): warning #2176: Unrecognized character escape sequence '\\P'.
    F:\Programme\PellesC\Projects\LC2005\interval.h(24): warning #2176: Unrecognized character escape sequence '\\L'.
    F:\Programme\PellesC\Projects\LC2005\interval.h(24): warning #2176: Unrecognized character escape sequence '\\l'.
    F:\Programme\PellesC\Projects\LC2005\interval.h(24): error #2156: Unrecognized declaration.
    *** Error code: 1 ***