PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] altes Programm kompilieren


Hypothraxer @ Gast
2008-12-10, 10:33:46
Ich habe hier einen Algorithmus der in C in den späten 90er Jahren geschrieben wurde. Ich möchte den gerne Debuggen, weil ich dadurch leichter zu den entsprechenden Formeln komme (das Ganze ist in sehr viele Files aufgeteilt).

Jetzt gibt es beim Kompilieren aber zwei Probleme:

Das erste (wohl gravierendere):


/usr/lib/gcc/i386-redhat-linux/4.1.2/include/varargs.h:4:2: error: #error "GCC no longer implements <varargs.h>."
/usr/lib/gcc/i386-redhat-linux/4.1.2/include/varargs.h:5:2: error: #error "Revise your code to use <stdarg.h>."


Das ist auch richtig - das Programm verwendet varargs.h statt stdarg.h. Ich könnte das zwar ändern, das führt aber dazu, dass alle Aufrufe mit

va_start(para);


falsch sind, da nur ein Argument angegeben wird (was für varargs.h richtig, für stdarg.h aber 'falsch' ist - da braucht es 2 Argumente).

Das zweite Problem ist, dass mir bei folgendem ein Syntax-Fehler ausgegeben wird:


#include "m.h"
#include <varargs.h>

COUNT m_setall(va_alist)
va_dcl
{
register va_list para;
register double *data;
M_TYP typ;
register COUNT i;
register COUNT n;
COUNT errflag = 0;

va_start(para);
typ = va_arg(para, M_TYP);
if ((n = m_get_length(typ)) == -1)
errflag = -1;
else {
data = va_arg(para, double *);
for (i = 0; i < n; i++)
*data++ = va_arg(para, double);
}
return(errflag);
}


Und zwar beim va_dcl (und entsprechend bei der Klammer unten). Selbst wenn ich statt varargs.h, stdarg.h verwende, wird mir das als Fehler angekreidet.


../wild/src/m_setall.c:100: error: expected declaration specifiers before ‘va_dcl’
../wild/src/m_setall.c:119: error: expected ‘{’ at end of input


Gibt es eine Möglichkeit, den Code mit neuen GCC Versionen zu kompilieren? Oder muss ich mich, wohl oder übel, durch den Code wühlen? Verändern möchte ich den Code nicht wirklich, da er als 'stabil und korrekt arbeitend' gekennzeichnet wird.

Über Tipps/Hinweise würde ich mich freuen.

Hypothraxer @ Gast
2008-12-10, 10:34:42
Edit: Sollte späte 80er Jahre heissen :/

Kinman
2008-12-10, 10:43:34
das wäre der Inhalt der varargs.h


#ifndef __VARARGS_H
#define __VARARGS_H

#ifdef __STDARG_H
#error Can't include both STDARG.H and VARARGS.H
#endif

#if !defined(___DEFS_H)
#include <_defs.h>
#endif

typedef void _FAR *va_list;
#define va_dcl va_list va_alist;
#define va_start(ap) ap = (va_list)&va_alist
#define va_arg(ap, type) (*(type _FAR *)(((*(char _FAR *_FAR *)&(ap))+=((sizeof(type)+1) & 0xFFFE))-(((sizeof(type)+1) & 0xFFFE))))
#define va_end(ap) ap = ((void _FAR *)0)

#endif /* __VARARGS_H */


Was bräuchtest Du noch? Ich habe nämlich noch eine Uralte C/C++ IDE

mfg Kinman

Hypothraxer @ Gast
2008-12-10, 12:35:24
Wow - schonmal vielen Dank! Funktionieren tut es allerdings noch nicht :)


/usr/lib/gcc/i386-redhat-linux/4.1.2/include/varargs.h error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token


Einige weitere Fehler sind auch dabei, aber die stammen wohl hauptsächlich von dem Fehler da.

Das Problem liegt wohl in der Zeile begraben.


typedef void _FAR *va_list;


Da will GCC wohl ein Gleich, Komma oder sonstwas sehen. Ich probiere da noch ein wenig rum.

Hypothraxer @ Gast
2008-12-10, 16:19:00
Nachtrag: Ich scheine das Problem gelöst zu haben. Ich habe eine andere varargs.h Datei gefunden und mit der scheints zu funktionieren (zumindest mit den Makefiles):


#ifndef __VARARGS_H
#define __VARARGS_H

typedef char *va_list;

#define va_dcl va_list va_alist;
#define va_start(ap) ap = (va_list)va_alist
#define va_arg(ap,t) ((t *)(ap += sizeof(t)))[-1]
#define va_end(ap) ap = NULL

#endif


Danke für den Tipp mit dem Ersetzen der varargs.h :)