incompatible types in assignment

  • hallo an alle,


    ich schreibe ein progamm in dem datenbanken angelegt werden.
    (zu meiner person: c newbie, palm programming newbie)


    in einer extra datenbank werden die datenbanknummern nach dem anlegen gespeichert.
    nun will ich auch die datenbanken wieder loeschen koennen.
    dazu soll spaeter eine liste erstellt werden die untereinander die datenbanknummern zeigt.
    aber ich kann nicht einmal die eintraege aus der datenbank auslesen.


    beim kompilieren erhalte ich folgende fehlermeldung:

    Code
    [admin@emma kartei]$ make
    m68k-palmos-gcc -g -O2 -o kartei kartei.c
    kartei.c: In function `StartApplication':
    kartei.c:28: warning: passing arg 2 of `StrIToA' makes integer from pointer without a cast
    kartei.c: In function `KarteiLoeschenFrmHandleEvent':
    kartei.c:241: incompatible types in assignment
    make: *** [code0000.kartei.grc] Fehler 1


    mein programm beinhaltet folgende einschlaegige programmteile:
    [PHP]
    // Wenn der Button "Anlegen" gedrückt wurde
    case KarteiAnlegen:
    // Das aktive Formular wird als Zeiger der Variable "formular" bekannt gemacht
    formular = FrmGetActiveForm();
    // Zeiger auf den Feldinhalt holen
    feldZeiger = FrmGetObjectPtr(formular,
    FrmGetObjectIndex(formular, KarteiName));
    // Den Inhalt des Feldes "KarteiName" in den String textZeiger kopieren
    textZeiger = FldGetTextPtr(feldZeiger);
    // Einen Zeiger auf die Liste "KarteiFarbe" anlegen
    listenZeiger = FrmGetObjectPtr(formular,
    FrmGetObjectIndex(formular, KarteiFarbe));
    // Den gewählten Popup-Listeneintrag ermitteln
    KarteiFarbeAuswahl = LstGetSelectionText(listenZeiger,
    LstGetSelection(listenZeiger));
    // Wenn eine Name für die Datenbank eingegeben wurde
    if(textZeiger != NULL) {
    // Hinweisfenster mit Frage ausgeben und mit hilfe der switch-Anweisung
    // ermitteln welcher Button bei der Frage gedrückt wurde

    switch(FrmCustomAlert(KarteiFrageAnlegen, textZeiger, KarteiFarbeAuswahl, NULL)) {
    // Wenn "Ja" gedrückt wurde
    case 0:
    // Anlegen der Datenbank
    fehler = DmCreateDatabase(speicherKarte,
    textZeiger, 'KTEI', 0, false);
    // Überprüfen ob das Anlegen der Datenbank fehlschlug
    if(fehler) {
    // Hinweis ausgeben, daß das Anlegen fehlschlug
    FrmCustomAlert(KarteiFehler,
    "Fehler beim anlegen der Datenbank:", StrIToA(fehlercode, fehler), NULL);
    } // Ende der if-Abfrage auf fehler unleich NULL
    // Wenn das Anlegen der Datenbank erfolgreich war
    else {
    position = 0;
    // Nummer der Benutzerdatenbank ermitteln
    datenbankNr = DmFindDatabase(speicherKarte, textZeiger);
    // Nummer der Systemdatenbank ermitteln
    KarteiDB_datenbankNr = DmFindDatabase(speicherKarte, "KarteiDB_KTEI");
    // Systemdatenbank öffnen, im schreib-lese Modus
    datenbankZeiger = DmOpenDatabase(speicherKarte,
    KarteiDB_datenbankNr, dmModeReadWrite);
    if(datenbankZeiger == 0)
    WinDrawChars("Line 161",8, 0, 15);
    // Neuen Datenbank-Eintrag-Bereich in der Systemdatenbank reservieren
    // indem nach freiem Speicherplatz gefragt wird
    datensatzHandle = DmNewRecord(datenbankZeiger, &position,
    sizeof(KarteiDB_datenbankNr));
    // Wenn das Reservieren des freien Speicherplatzes fehlschlug
    if(datensatzHandle == 0)
    WinDrawChars("Fehler beim Einfuegen",20, 0, 50);
    // Den neuen Datenbank-Eintrag-Bereich sperren
    // um das eigene Schreiben zu sichern
    datensatzZeiger = MemHandleLock(datensatzHandle);
    // Nummer der Datenbank in die Systemdatenbank KarteiDB_KTEI schreiben
    DmWrite(datensatzZeiger, 0, &datenbankNr,
    sizeof(KarteiDB_datenbankNr));
    // Hinweis ausgeben, daß das Anlegen erfolgreich war
    FrmCustomAlert(KarteiHinweis, "Die Datenbank", textZeiger, "konnte angelegt werden.");
    } // Ende der if-Alternative auf fehler ungleich NULL

    handled = true;
    break;
    // Wenn "Nein" gedrückt wurde
    case 1:
    handled = true;
    break;
    } // Ende der switch-Abfrage welcher Button bei der Frage gestellt wurde
    handled = true;
    break;
    } // Ende der if-Abfrage ob "textZeiger" ungleich 0[/PHP]
    [PHP]
    // Funktion zum Abfragen der Formularevents von KarteiLoeschen
    Boolean KarteiLoeschenFrmHandleEvent(EventPtr event) {


    typedef struct {
    UInt16 Datenbanknummer;
    UInt16 leer;
    } Datensatz;
    char ausgabe[3];
    FormPtr formular;
    Boolean handled = false;
    Err fehler = 0;
    LocalID datenbankNr;
    LocalID datenbankNrAusgabe;
    UInt16 speicherKarte = 0;
    DmOpenRef datenbankZeiger;
    UInt16 datenbankAnzahlEintraege;
    UInt16 i;
    MemHandle lesenHandle;
    Datensatz* lesenZeiger;


    // switch-Abfrage zum ermitteln des Formularevents von "KarteiLoeschenFrmHandleEvent"
    switch(event->eType) {
    case frmOpenEvent:
    // Das aktive Formular wird als Zeiger der Variable "formular" bekannt gemacht
    formular = FrmGetActiveForm();
    // Zeichnen des Formulars "KarteiNeuFormular"
    FrmDrawForm(formular);
    // Ermitteln der Datenbanknummer der Systemdatenbank KarteiDB_KTEI
    datenbankNr = DmFindDatabase(speicherKarte, "KarteiDB_KTEI");
    // Öffnen der Systemdatenbank KarteiDB_KTEI
    datenbankZeiger = DmOpenDatabase(speicherKarte,
    datenbankNr, dmModeReadWrite);
    // Anzahl der Datensätze ermitteln
    datenbankAnzahlEintraege = DmNumRecords(datenbankZeiger);
    // Speicher für nummerische Ausgabe
    for(i = 0; i < datenbankAnzahlEintraege; i++) {
    // Datenbank abfragen nach Records
    lesenHandle = DmQueryRecord(datenbankZeiger, i);
    // Testen ob es einen ermittelt wurde
    if(lesenHandle != NULL) {
    // Pointer auf den Datensatz ermitteln
    lesenZeiger = (Datensatz *) MemHandleLock(lesenHandle);
    // Datenbanknummer ausgeben
    ausgabe=StrIToA(ausgabe, lesenZeiger->Datenbanknummer);
    WinDrawChars(ausgabe,StrLen(ausgabe), 0, i*10);
    // Speicher freigeben
    MemHandleUnlock(lesenHandle);
    } // Ende der if-Abfrage "lesenHandle gleich Null"
    } // Ende der for-Schleife "i kleiner datenbankAnzahlEintraege"

    handled = true;
    break; // break für "case frmOpenEvent"[/PHP]
    gerne schicke ich auch das ganze programm.


    was ich auch mache ich bekomme das programm nicht kompiliert.
    dabei habe ich viele programmteile aus dem buch von dirk noeldner "palm os programmierung" entnommen. ein buch mir vielen fehlern. :(
    nun kann es sein das auch hier ein fehler im buch mein programm schrottet.
    aber ich kenne mich auch wenig mit c aus
    und habe schwierigkeiten das zeigersystem zu verstehen.
    zwar habe ich einfuerungen in c gelesen, aber wirklich damit arbeiten kann ich noch nicht. also kann auch der fehler vor meinem rechner sitzen.


    ueber antworten freue ich mich natuerlich.

    • Official Post

    Hey, poste doch mal nur die Stellen auf die sich die Fehlerausgaben beziehen. Die Zeilennummern stehen ja dabei. Wer soll sich denn das alles anschauen?


    Gruß
    Henk


    PS: "ausgabe=StrIToA(ausgabe, lesenZeiger->Datenbanknummer);" das "ausgabe=" kannst und solltest Du weglassen.

  • @henk


    super! nun geht es.
    das ausgabe= war der fehler.
    wie schon geschrieben: das buch ist rotze.


    nach ein paar weiteren aenderungen werden nun
    die datenbanknummer untereinander gelistet.
    leider haengt sich pose danach auf mit der fehlermeldung:

    Code
    Kartei (0.0.7) just read from memory location 0x35323100,
    causing a bus error.
    
    
    A "bus error" means that the application accessed a
    memory location that is not in RAM or ROM, nor
    corresponds to a memory-mapped hardware register.


    ich verstehe nur das auf in einen bereich zugegriffen wird,
    der weder ram noch rom ist, vielleicht ein zeiger?
    kann es sein das der pose sehr zimperlich ist
    und das dieser fehler bei einem hardware palm nicht auftreten wuerde?
    habe mein palm gerade in der reparatur.



    hier der betreffende teil:
    [PHP]
    // Funktion zum Abfragen der Formularevents von KarteiLoeschen
    Boolean KarteiLoeschenFrmHandleEvent(EventPtr event) {


    typedef struct {
    UInt32 Datenbanknummer;
    } Datensatz;
    char ausgabe[3];
    LocalID datenbankNr;
    DmOpenRef datenbankZeiger;
    UInt16 datenbankAnzahlEintraege;
    UInt16 i;
    MemHandle lesenHandle;
    Datensatz* lesenZeiger;


    [..]
    // Anzahl der Datensätze ermitteln
    datenbankAnzahlEintraege = DmNumRecords(datenbankZeiger);
    // Speicher für nummerische Ausgabe
    for(i = 0; i < datenbankAnzahlEintraege; i++) {
    // Datenbank abfragen nach Records
    lesenHandle = DmQueryRecord(datenbankZeiger, i);
    // Testen ob es einen ermittelt wurde
    if(lesenHandle != NULL) {
    // Pointer auf den Datensatz ermitteln
    lesenZeiger = (Datensatz *) MemHandleLock(lesenHandle);
    // Datenbanknummer ausgeben
    StrIToA(ausgabe, lesenZeiger->Datenbanknummer);
    WinDrawChars(ausgabe,StrLen(ausgabe), 0, i*10);
    // Speicher freigeben
    MemHandleUnlock(lesenHandle);
    } // Ende der if-Abfrage "lesenHandle gleich Null"
    } // Ende der for-Schleife "i kleiner datenbankAnzahlEintraege"

    handled = true;
    break; // break für "case frmOpenEvent"
    [/PHP]

    • Official Post


    Also wenn POSE einen Fehler meldet (und speziell einen illegalen Speicherzugriff) dann ist da was dran und Du solltest es besser nicht auf einem echten Gerät ausprobieren.
    Was den Fehler auslöst, kann ich jetzt auch nicht sagen, aber die Adresse sieht stark nach einem String-ende aus:


    0x35 = '5'
    0x32 = '2'
    0x31 = '1'
    0x00 = termination


    Bist Du Dir sicher, das 3 ausreichend ist bei "char ausgabe[3];" ?

  • MetaView


    top tip! :)


    ja, ich habe ausgabe auf 9 vergroessert.
    nun klappt es!


    aber ... nur einmal :(
    das heisst: nachdem ich das formular KarteiLoeschen verlasse
    und wieder zurueckkomme tritt ein aehnlicher fehler auf:

    Code
    Kartei (0.0.7) just read from memory location 0x4E55FFFC,
    causing a bus error.
    
    
    A "bus error" means that the application accessed a
    memory location that is not in RAM or ROM, nor
    corresponds to a memory-mapped hardware register.


    ich habe mir gedacht dass eine variable beim zweiten start
    der funktion KarteiLoeschenFrmHandleEvent "belegt" oder "besetzt" ist.
    auf jeden fall kann ich das formular nur einmal nutzen,
    beim zweiten eintritt haengt pose wieder, aehnlich wie vorher.
    aber mit zwei unterschieden 1. die datenbanknummer (8384951) wird nicht mehr ausgegeben 2. die speicheradresse ist eine andere 0x4E55FFFC).


    hast du eine idee warum nun wieder ein speicherbereich verwendet wird der ungueltig ist?


    ps: ich habe vorsichtshalber den gesammten bereich hier angehaengt:


    • Official Post

    moin,


    Du schließt scheinbar die DB nicht, nach dem Öffnen und Auslesen der Nummern.
    Hast Du mal probiert zu debuggen? Manche Fehler finden sich dann leichter. Oder mit HostTraceOutputTL() debug ausgaben einzubauen?


    Gruß
    Henk

  • so, nun bin ich aus der sonne zurueck ...


    hallo MetaView,


    Quote


    Du schließt scheinbar die DB nicht, nach dem Öffnen und Auslesen der Nummern.


    ja, das habe ich mir auch schon gedacht.
    aber wenn ich das tue bekomme ich andere fehler.


    ersteinmal moechte ich die ergebnisse des debuggers posten.


    meine debugging habe ich so durch gefuehrt:


    1. pose mit dem rom PalmOS412_FullDgb_EZ_EFIGS.rom gestartet
    2. mein programm installiert
    3. eine datenbank angelegt
    4. m68k-palmos-gdb gestartet
    5. "target pilot telnet:2000" eingegeben
    6. mein programm gestartet
    7. formular "loeschen" geoeffnet => alles in ordnung
    8. zum startformular zurueck
    9. wieder formular "loeschen" geoffnet


    nun kommt folgende fehlermeldung:

    Code
    Kartei (0.0.7) called SysFatalAlert with the message:
    "DataMgr.c, Line:9660, Bad DBRef".


    jetzt habe ich zwei moeglichkeiten:


    Code
    " Debug <-' " druecken


    pose stuerzt ab und m68k-palmos-gdb verabschiedet sich mit:

    Code
    0x10c16a3c in ErrDisplayFileLineMsg ()


    oder


    Code
    " Continue " druecken


    die bekannte fehlermeldung taucht auf:

    Code
    Kartei (0.0.7) just read from memory location 0x4E55FFF8,
    causing a bus error.
    
    
    A "bus error" means that the application accessed a
    memory location that is not in RAM or ROM, nor
    corresponds to a memory-mapped hardware register.


    druecke ich nun wieder und wieder " Continue "
    stuerzt nach ein paar mal pose ab und m68k-palmos-gdb verabschiedet sich mit:

    Code
    0x10c19ed6 in PrvHandleCheck ()


    ich glaube auch das es mit den offenen datenbanken zusammen haengt.
    aber das schliessen macht auch probleme.
    willst du die fehlermeldungen sehen
    wenn ich das schliessen der datenbank einbaue?


    Quote


    Oder mit HostTraceOutputTL() debug ausgaben einzubauen?


    ich weiss nicht wie.
    in meinem buch habe ich nichts darueber gefunden.


    wo, an welcher stelle in dem programm,
    sollte ich deiner meinung nach die datenbank schliessen -
    wenn ich das formular "loeschen" verlasse?

    • Official Post

    Wer seine Datenbank in FrmOpen öffnet sollte sie in FrmClose schließen.
    Und was kommt als Fehlermeldung?


    Ach jetzt seh ich's Deine ganzen Variablen sind nur für einen Durchgang in der Eventloop gültig. Wenn der Bereich in dem sie deklariert wurden verlassen wird, sind die ganzen Inhalte wech. Also entweder Du brauchst sie danach nciht mehr (und initialisierst alles neu beim nächsten Eintritt in die Funktion (eher unschön)) oder Du machst sie global -> außerhalb einer Funktion deklarieren. Das wäre das einfachste für's erste.


    Gruß
    Henk


    Und kauf Dir mal ein Buch über C.