• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Brauche ein wenig C-Hilfe

Spielwurm

Advanced Hacker
Was ist hier falsch (Ausgabe von gcc):
Code:
src/mem.c:66:14: warning: incompatible implicit declaration of built-in function ‘strlen’ [enabled by default]
     length = strlen (ROMFile[i]);

Spielwurm
 

spoensche

Moderator
Teammitglied
Das sieht so aus als hättest du vergessen die stdlib.h in deiner mem.c einzubinden. Du musst also deine bestehenden #include Preprozessoranweisungen um

Code:
#include <stdlib.h>

erweitern. Beim darauf folgenden Compiliervorgang taucht die Meldung dann nicht mehr auf.
 
A

Anonymous

Gast
Da war schon jemand wieder schneller ;) , dafür aber etwas ungenau. hier nicht stdlib.h sondern string.h
stdlib.h bindet string.h nicht automatisch mit ein.

hier fehlt die Deklaration der Funktion strlen() . also das Einbinden der Headerdatei /usr/include/string.h

Wenn du das selbst geschrieben hast, (bzw dort irgendwo am Quellcode bei den Headerdateien rumgespielt hast) dann an den Anfang der *.c Datei wo schon einige Header incluiert sein werden, noch zusätzlich einfügen.
#include <string.h>

Wenn das fertiger Quellcode ist, dann ist er eventuell nicht ganz sauber und kompatibel für alle Systeme geschrieben. Oft werden solche Standard Header auch über zum Quellcode gehörende Headerdateien mit eingebunden, nur selten in den *.c Dateien selbst. Manchmal ist unsauber geschrieben, dann stimmt die Reihenfolge der Header nicht, dann kommt sowas auch vor.

robi
 
OP
S

Spielwurm

Advanced Hacker
OK, danke. Habe mir schon sowas gedacht. Ich versuche gerade, einen uralten CPC-Emulator wieder zum Leben zu erwecken. C habe ich nicht gelernt, aber von Pascal ist noch eine Menge übrig.
Zwei habe ich noch:
Code:
 RAM = (byte *)malloc (j);
und
Code:
 free (UpperROM[i]);
Welche Includes gehören denn dazu?

Spielwurm
 
OP
S

Spielwurm

Advanced Hacker
Danke, damit läuft die Compilierung ohne Fehleranzeige durch. Aber das Programm startet nicht durch:
Code:
*** Error in `/usr/lib/cpc/cpc4x.bin': double free or corruption (!prev): 0x000000000158feb0 ***
*** Error in `/usr/lib/cpc/cpc4x.bin': malloc(): memory corruption: 0x00000000015905a0 ***
Inconsistency detected by ld.so: dl-open.c: 220: dl_open_worker: Assertion `_dl_debug_initialize (0, args->nsid)->r_state == RT_CONSISTENT' failed!
Hat jemand einen Tip, wonach ich suchen könnte?

Spielwurm
 

abgdf

Guru
Es kann durchaus sein, daß ein Programm zu alt ist und auf neuen Systemen dann nicht funktioniert, z.B. weil sich gcc, stdlib, bzw. glibc inzwischen geändert haben.
Unter Windows hatte ich ganz gute Erfahrungen mit Caprice (ich bin aber mehr ein Spectrum- als ein CPC-Fan). Offenbar gibt es auch eine Linux-Version:

http://sourceforge.net/projects/caprice32/
 
Versuch mal folgendes:
export MALLOC_CHECK_=0
/usr/lib/cpc/cpc4x.bin

Die libc hat irgendwann mal eingebaut bekommen, dass man einen Abbruch bekommt, wenn zweimal der selbe
Speicherbereich freigegeben wird. Mit der internen glibc-Variable kann man das steuern.

Wobei der Code ist das "schlecht". Bei anderen Gelegenheiten kann ein "double free" gut zu Sicherheitslücken führen.
Der Parameter ist also nur für echte Notfälle zum Ausprobieren geeignet.

MALLOC_CHECK_=0 => aus
MALLOC_CHECK_=1 => Stack trace, aber läuft weiter
MALLOC_CHECK_=2 => ABORT ( core, wenn eingeschaltet )
MALLOC_CHECK_=3 => ABORT (core, wenn eingeschaltet) + Stack trace

Haveaniceday
 
Oben