Variablen.. mal wieder..

Hallo zusammen,

ich fang gleich echt zum heuln an.. ich hasse die Variablentypen in C.. wer ist auf die Idee gekommen, so einen scheiß zu machen >.<.. so.. genug geheult.

Also, wie ihr gerade schon gelesen habt, bei mir wollen die Variablen wieder mal nicht. Hat jemand nen Link zu ner guten Lektüre zur Hand? Kann ich googlen, was ich will, ich find nichts, womit ich mein Problem lösen kann.. wie dem auch sei:

Ich muss meinen Link zusammen basteln.

[...]
int conSerial[MAX_NUMBERS];
[...]
char url[] = "/archery_results/entw/templates/terminal_communication.php?do=write&1=" conSerial[1] "&2=" conSerial[3]."&3="+conSerial[4]+"&4="+conSerial[5]+"&5="+conSerial[6]+"&6="+conSerial[7]+"&7="+conSerial[8]+"&8="+conSerial[9]+"&9="+conSerial[10]+"&10="+conSerial[11]+"&11="+conSerial[12]+"&12="+conSerial[13]+"&13="+conSerial[14];
client.println("GET "+url);
[...]

Irgendwie bin ich einfach zu blöd dafür. Mal wieder kein Dunst, wie ich das hin kriegen soll.. ich hoff auf eure Hilfe..

LG

Ein zermürbter

Fipsi

Mit "+" funktioniert das nicht, sowas geht bei Pascal wenn du String Objekte hast.
Die Arduino hat auch sowas:

Sogar ich bin davon abgekommen dies zu benutzen.

Hier hast du ein Array url[] - jedes Element ist ein Char.
Dort willst du quasi ein anderes Char array "GET" an Anfang anfügen.

Man könnte jetzt überlegen wie man das zu Fuß macht.
Oder strcat benutzen.

Was hat das mit Variablentypen zu tun? Es gilt wie in jeder anderen Sprache auch, die Syntax zu lernen.
Zum einen gehört da eine { } rum.

Des weiteren wird das mit " so nicht funktionieren. Nutzt die Ascii Codes dafür.

rudirabbit:

Dass das mit "+" nicht geht hab ich auch festgestellt.. ich hats vergessen, wie raus zu löschen. Ich komm auf der "Serverecke" und in JS geht's ja z. B. so :wink:

Ja.. url ist char, strcat hatte ich auch schon gefunden, aber - deswegen hab ich "int conSerial[MAX_NUMBERS];" mit dazu kopiert - conSerial ist int, nicht char. Heißt, das geht wieder nicht.

sschultewolter:

Das hat mit Variablentypen insofern zu tun, dass ich einmal char und einmal int hab. Und die will, oder besser gesagt muss, ich in einen Sack stecken.

LG

Fipsi

Du kannst aber nicht einfach verschiende Typen zusammen würfeln. Int musst du nach char umwandeln. -> itoa(int, char*, 10).

snprintf_P() ist auch eine Möglichkeit hier. Braucht aber auch am meisten Speicher.

Fipsi:
Irgendwie bin ich einfach zu blöd dafür. Mal wieder kein Dunst, wie ich das hin kriegen soll..

Wenn Du in C/C++ programmieren möchtest, lerne in C/C++ zu programmieren!

Sorry fipsi, hatte dein char url[] als Konstante gesehen und nicht genauer angesehen. :-[

jurs:
Wenn Du in C/C++ programmieren möchtest, lerne in C/C++ zu programmieren!

Na ja, dafür ist dieses Forum unter anderem da.
Es ist oft zu lesen das der Arduino mit keinen Vorkennissen einfach zu Programmieren ist.
fipsi kommt aus der IT Ecke und stolpert trotzdem.
Ich habe nur Hobbymässig vor 20 Jahren Pascal gelernt, und seit 2 Jahren auch auf diese Weise C/C++ angeeignet.

Ich weiß, dass ich die verschiedenen Typen nicht einfach zusammen schmeißen kann.

Schlagt mich jetzt dafür, aber ich begreifs einfach nicht, wie ich das jetzt alles in eine Variable bekomm, die ich dann einfach in "client.println();" einsetzen kann..
Hat zufällig jemand nen Vorschlaghammer der Weisheit im Keller und will mir damit so lang aufn Kopf haun, bis ich das in Schädel gekriegt hab?
Das zu char konvertrieren krieg ich ja "grad noch so" hin, aber dann ist auch schon wieder ende..

LG

Fipsi

Der erste Fehler ist hier zu denken, dass das alles in einem String stehen muss. Das kann man genausogut stückeln. Macht vielleicht von der Performance her einen Unterschied, dass dass dann eventuell in mehr Pakete aufgeteilt wird, aber das sollte egal sein.

Du kannst also einfach sowas machen:

client.print(F("GET "));
client.print(F("/archery_results/entw/templates/terminal_communication.php?do=write&1="));
client.println(conSerial[1]);

Hier würde ich dann dringend die Streaming Library empfehlen:
http://arduiniana.org/libraries/streaming/

Damit kann man das sehr bequem mit der C++ Stream Syntax schreiben (sowas einfach müsste eigentlich in der Arduino IDE enthalten sein):

client << F("GET /archery_results/entw/templates/terminal_communication.php?do=write&1=") << conSerial[1] << ... << endl;

So, da mir Google bei der Frage nicht helfen kann^^: Für was steht das "F"?

Und ich versuche die lib-Sammlung so klein wie möglich zu halten, da ich eine Menge Speicherplatz brauch.. Ich bin jetzt schon bei gut 20 KB und mir fehlt noch jede Menge im Code.. ich schätz mal am Ende werd ich meinen Code eh noch irgendwie komprimieren müssen.. aber da schau ich dann, wenns so weit ist.

Und auf das print statt println hät ich auch kommen können facepalm

Vielen Dank

LG

Fipsi

Oh je, oh je. :roll_eyes: Diese Library braucht Null Ressourcen. Das sind alles inline Funktionen. Da wird lediglich der << Operator überladen. Vom Code her springt genau das gleiche heraus wie man per Hand print() schreibt. Aber kann die Anweisungen schön verketten.

F() steht für "Flash" und erstellt einen String im Flash. Sonst verschwendest du da massig RAM. Funktioniert nur mit print()/println()

Okay..? Ich hab die libs bisher halt immer so verstanden:

Alle libs, bzw. in dem Fall könnte man ja eher Dateien sagen, die eingebunden werden, werden beim kompilieren an die Stelle mit in die eine Datei gezogen und dann allesamt auf den IC geschoben. Holzweg? Und die lib muss ich ja auch erst downloaden und die muss ja doch irgendwo hin? Oder schreibt der Compiler das um..? Ooooh man.

LG

Fipsi

Die meisten Libraries brauchen natürlich Flash und RAM.

Die hier ist aber etwas anderes. Das steht auf der Seite auch dabei. Und wenn man sich den Header mal ansieht sieht man auch dass es wahr ist:

template<class T> 
inline Print &operator <<(Print &stream, T arg) 
{ 
    stream.print(arg); 
    return stream; 
}

Das überlad also den << Operator und nimmt eine Referenz auf ein Objekt das von der Print Klasse abgeleitet ist (wie Serial, lcd oder client). Dann gibt es den Wert mit print() aus und gibt die Referenz auf das Print Objekt wieder zurück. Letzteres ist der Grund weshalb man die Anweisungen verketten kann und der ganze Sinn der Sache.

Das ist eine inline Funktion. Die Funktion wird also nicht aufgerufen, sondern deren Inhalt wird an der Stelle direkt in den Code geschrieben:

Dann ist noch etwas Code drin, damit die Formatierung von Binär oder Hex funktioniert, aber das sind Makros die ebenfalls keinen Speicher brauchen.

Du musst das nicht verwenden, aber diese Stream Syntax ist hier einfach angenehmer zu lesen und zu schreiben als jedesmal Client.print() zu schreiben und das über zig Zeilen aufzuteilen.

Na dann werd ich mir die mal runter laden und einbinden.
Ich schätz mal, wenns so viele print-Befehle wie bei mir sind, dann könnte das auch positiv aufn Speicher gehen? Mach gleich mal den vergleich..

LG

Fipsi

Nichts kleiner.. hab grad nen bissl längeren Ethernet-Befehl umgeschrieben, jetzt hab ich 8 Byte mehr. Ich glaub jetzt aber mal, dass die's nicht groß raus reißen.

LG

Fipsi

Natürlich ist es nicht kleiner. Das macht doch genau das gleiche. Der Compiler ersetzt im Hintergrund lediglich die eine Syntax durch die andere.

Okay.. doch kleiner.. gerade ne Serial-Befehlskette umgeschrieben:
Am Anfang: 20.516 Byte
Nach der Client-Kette umgeschrieben: 20.524 Byte
Nach der Serial-Kette umgeschrieben: 20.238 Byte

Ist zwar jetzt keine Welt, aber Kleinvieh macht ja auch Mist und das kann was bei mir ausmachen^^.

Vielen Dank und LG

Fipsi

auf der gleichen Webseite gibt's noch die PString lib. Da kann man in eine Variable streamen, die ein char repräsentiert.

Ptesttext<<"Hallo " << integervariable<<" Welt "<< floatvariable << endl;

Ideal, wenn man dann Ptesttext auf verschiedenen Medien (seriell, lcd, webseite) gleichzeitig ausgeben will.