PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Übersetzung von C nach Compact-C



Fabian E.
17.04.2010, 17:04
Hallo,

ich habe diese C-Funktion:

#define MAX_PARAMS 6
int params[MAX_PARAMS];

int cmdsplit(char*cmd_string)
{
int cursor = 0;
int param_nr = 0;

// Parameterarray initialisieren
for (int i=0;i<MAX_PARAMS;i++)
params[i] = -1;

/* Prüfen ob der command-string gültig beginnt */
if ((cmd_string == NULL) || (cmd_string[cursor] != '#'))
return -1;

while (cmd_string[cursor] != '\0' && cmd_string[cursor] != '*') // prüfen ob das ende erreicht wurde
{
char *tmp;

cursor++;
tmp = (cmd_string + cursor); // tmp wird auf den anfang des für atoi auszulesenden werts "gesetzt"
params[param_nr] = atoi(tmp); // wert auslesen
if (param_nr >= MAX_PARAMS) // sind mehr parameter verfügbar als erwartet? Stimmt was mit dem Commando nicht...
return -1;
param_nr++;

// Überspingen der ausgelesen Zeichen und ermitteln des nächsten "interessanten" Teils im string.
while((cmd_string[cursor] != ':') && (cmd_string[cursor] != '*') && (cmd_string[cursor] != '\0'))
cursor++;
}

return param_nr;
}


Leider funktioniert das so mit Compact-C nicht. Es gibt einige Syntaxfehler. Z.B. mag der die Pointer überhaupt nicht. Auch die Funktion "atoi" kennt er nicht.

Kann mir jemand helfen, das zu übersetzen?

Del
17.04.2010, 17:37
Hmm, statt nem char-Pointer n char-Array benutzen.
Und atoi lässt sich sehr einfach selbst programmieren.

Fabian E.
18.04.2010, 00:59
Okay, nur ehrlich gesagt habe ich nicht die geringste Ahnung von C-Programmieren... Mein Gebiet ist eher .NET/C#. Kann mir dewegen vielleicht jemand verraten wie man atoi selbst schreibt?

Del
18.04.2010, 02:38
Mein Gebiet ist eher .NET/C#
Glaub ich nich...
Das hat doch mit der Sprache nichts zu tun!
Du nimmst den ASCII Wert von array[1] subtrahierst den um den Wert in der ASCII Tabelle um auf den Wert der Ziffer zu kommen und addierst ihn zu der Interger Variable, dann nimmst du array[2] multiplizierst ihn mit 10 und addierst ihn zu der Integer Variable, dann nimmst du array[3]....
Fertig.

shedepe
18.04.2010, 10:37
Doch es hat schon was mit der Sprache zu tun. Unter .Net muss man sich mit sachen wie atoi, pointer oder der Dastellung von strings als char arrays relativ wenig rumschlagen.

Fabian E.
18.04.2010, 10:52
Mein Gebiet ist eher .NET/C#
Glaub ich nich...
Das hat doch mit der Sprache nichts zu tun!
Du nimmst den ASCII Wert von array[1] subtrahierst den um den Wert in der ASCII Tabelle um auf den Wert der Ziffer zu kommen und addierst ihn zu der Interger Variable, dann nimmst du array[2] multiplizierst ihn mit 10 und addierst ihn zu der Integer Variable, dann nimmst du array[3]....
Fertig.

Danke schön :) Das werde ich dann wohl noch hinbekommen =)


Doch es hat schon was mit der Sprache zu tun. Unter .Net muss man sich mit sachen wie atoi, pointer oder der Dastellung von strings als char arrays relativ wenig rumschlagen.

Richtig. Unter .NET hast du alles lästige was man bei C/C++ noch selbst machen muss entweder automatisiert oder eben sehr vereinfacht. Pointer z.B. tauchen normalerweise bei .NET überhaupt nicht auf.

Del
18.04.2010, 11:45
Richtig. Unter .NET hast du alles lästige was man bei C/C++ noch selbst machen muss entweder automatisiert oder eben sehr vereinfacht. Pointer z.B. tauchen normalerweise bei .NET überhaupt nicht auf.
Nicht ganz richtig.
C++ bietet auch sehr viel damit man sich um sowas nciht kümmern muss.
Aber wie man jetzt gesehen hat fehlen durch diese "einfachen Sprachen" wichtige Grundlagen. Klar könnte man sagen das man es in diesen ganzen .NET Sprachen nicht mehr braucht, aber man kommt immer wieder an einen Punkt wo es halt doch nötig ist.

Fabian E.
02.05.2010, 21:29
Auf der M32 gab es die Funktion "getBufferLength()". Damit konnte man prüfen, ob auf der UART-Schnittstelle Daten warten. Gibt es diese auch bei der M128?
Die Funktion StrLen kennt er auch nicht... Gibt es dazu was passendes?

Magelan1979
02.05.2010, 21:33
Streiche StrLen, setzte Str_Len. Das funktioniert. Sieht zwar einfach aus, aber auch auf sowas muss man erstmal kommen.

P.S: Das war jetzt NULL böse gemeint