woviel zu "dann habt ihr eure Ruhe vor mir".. hätte ja wissen müssen, dass ich irgendwann an den Variablen-typen wieder hängen bleib..
Hab "n bissl" gegooglet, aber nichts gefunden, womit ich was anfangen kann.. englisch und so hust.
"invalid operands of types 'const char*' and 'const char[2]' to binary 'operator+'"
Wie kommen die beiden Variablen zustande?
server_ip_z enthält die einzelnen Stellen der IP-Adresse, die dann zusammengefügt und zum Verbindungsaufbau mit einem Server verwendet werden soll.
Ich hab nur kein Plan, wie ich die Variable so zusammenfügen kann.. (C ist so kompliziert, wenns um Variablentypen geht, da ist PHP viel leichter hust :D).
"server_ip" ist von Dir als Integer-Array deklariert, d.h. wenn Du "server_ip" ohne alles schreibst, ist das die "Zeigeradresse im RAM, wo sich das Array im RAM befindet" und "server_ip[zahl]" bzeichnet einen Integer-Wert.
In Deiner Programmzeile versuchst Du nun, eine "gemischte Addition" aus einem bunten Sammelsurium von Integer-Werten und Stringkonstanten irgendwie "zusammenzuzählen" (dazu wohl das "+" Zeichen) und die Summe (also eine Zahl?) soll dann die Zeigeradresse im RAM bezeichnen, an der das Array im RAM liegt?
Dass das ein völliger Bockmist ist, erkennt der Compiler und zeigt Dir eine Fehlermeldung.
So what?
Es gilt beim C-Programmieren das GIGO-Prinzip wie bei einem Mülleimer: Garbage In ==> Garbage Out
Und fehlerfrei compilieren kannst Du nur solchen Code, der wenigstens syntaktisch soweit korrekt ist, dass er kompiliert werden kann.
Okay, dann bräuchte ich mal nen anderen Anstoß, wie ich den Array mit den einzelnen Ziffern in eine Variable gepackt krieg. Ausgangspunkt ist der Array mit den 12 Ziffern, die am Ende die IP-Adresse ergeben sollen.
Und oh verdammt.. da fällt mir grad ein, ich muss den Array ja auch im EEPROM speichern.. wie krieg ich das mit dem Code hin, dass ich auch nen Array wieder raus krieg? :
void EEPromSave(byte* wert, int numbytes, int eprom_offset)
{
for (int i=0;i<numbytes;i++)
EEPROM.write(eprom_offset+i, wert[i]);
}
void EEPromLoad(byte* wert, int numbytes, int eprom_offset)
{
for (int i=0;i<numbytes;i++)
wert[i] = EEPROM.read(eprom_offset+i);
}
Versuche doch mal die Einzelnen "Summanden" deiner "Addition" vorab in einen String zu stecken.
Danach berechnest du den neuen String und arbeitest damit weiter.
Es ist totaler Unsinn jede Ziffer in einen int zu packen (wenn überhaupt dann Byte!). Und auch noch die Punkte abzuspeichern. Das verschwendet nur Speicher. Eine IP Adresse hat 4 Zahlen von 0-255. Entsprechend reichen 4 Bytes.
Fipsi:
Okay, dann bräuchte ich mal nen anderen Anstoß, wie ich den Array mit den einzelnen Ziffern in eine Variable gepackt krieg. Ausgangspunkt ist der Array mit den 12 Ziffern, die am Ende die IP-Adresse ergeben sollen.
Also als Input hast Du sowas wie einen String/Char-Array mit 12 ASCII-codierten Ziffern, und daraus sollen die vier Bytes für eine IP-Adresse gebildet werden?
Also Input sowas wie:
char server_ip_z[]="192168002178";
Und daraus soll etwas in der Art als Array werden, um es als IP-Adresse verwenden zu können:
Jurs: Genau.
Ich hab halt die IP-Adresse am Display (mit Punkten eigentlich) stehen und will mit den links/rechts-Tasten den Cursor zwischen den Ziffern navigieren und mit den rauf/runter-Tasten die Ziffern um eine Stelle verändern.
Der Code dazu:
switch(key)
{
// Taste Pfeil nach oben
case 'rauf':
// IP-Adresse einstellen
if (in_menue == 2)
{
if (server_ip_z[cursor_position_s] == 9)
{
server_ip_z[cursor_position_s] = 0;
}
else
{
server_ip_z + 1;
}
}
break;
// Taste Pfeil nach unten
case 'runter':
// IP-Adresse einstellen
if (in_menue == 2)
{
if (server_ip_z[cursor_position_s] == 0)
{
server_ip_z[cursor_position_s] = 9;
}
else
{
server_ip_z - 1;
}
}
break;
// Taste Pfeil nach links
case 'links':
// IP-Adresse Ziffern auswählen
if ((in_menue == 2) && (cursor_position_s > 0))
{
if (cursor_position_s == 4)
cursor_position_s = 2;
if (cursor_position_s == 8)
cursor_position_s = 6;
if (cursor_position_s == 12)
cursor_position_s = 10;
}
break;
// Taste Pfeil nach rechts
case 'rechts_':
// IP-Adresse Ziffern auswählen
if ((in_menue == 2) && (cursor_position_s < 14))
{
if (cursor_position_s == 2)
cursor_position_s = 4;
if (cursor_position_s == 6)
cursor_position_s = 8;
if (cursor_position_s == 10)
cursor_position_s = 12;
}
break;
}
Fipsi:
Jurs: Genau.
Ich hab halt die IP-Adresse am Display (mit Punkten eigentlich) stehen und will mit den links/rechts-Tasten den Cursor zwischen den Ziffern navigieren und mit den rauf/runter-Tasten die Ziffern um eine Stelle verändern.
Also hast Du einen String aus Ziffern und Punkten wie z.B.
char server_ip_z[16]="192.168.2.178";
und dieser String soll dann in eine IP-Adresse umgewandelt werden, die Du mit der Ethernet-Library verwenden kannst?
Richtig. Also ich will die IP-Adresse mit allen 12 Ziffern (also auch die 0'en) und den drei Punkten anzeigen lassen und jede Ziffer einzelnd ändern können und das brauch ich dann später für's Ethernet (womit ich mich aber bisher noch gar nicht auseinander gesetzt hab, das kommt als letztes^^).
Fipsi:
Richtig. Also ich will die IP-Adresse mit allen 12 Ziffern (also auch die 0'en) und den drei Punkten anzeigen lassen und jede Ziffer einzelnd ändern können und das brauch ich dann später für's Ethernet (womit ich mich aber bisher noch gar nicht auseinander gesetzt hab, das kommt als letztes^^).
Und bei mir haperts eben an der Umwandlung.
Anbei Umwandlung eines 15 Zeichen langen Char-Arrays in eine 4-Byte IP-Adresse, die von der Ehternet-Library direkt verwendet werden kann.
#include <SPI.h>
#include <Ethernet.h>
IPAddress ip(0,0,0,0);
char server_ip_z[16]="192.168.002.178";
void setup() {
Serial.begin(9600);
// Umwandlung der vier Zahlen in die vier Bytes der IP-Adresse
for (int i=0;i<4;i++) ip[i]=atoi(&server_ip_z[4*i]);
// Ausgabe der umgewandelten IP
for (int i=0;i<4;i++)
{
Serial.print(ip[i]);
if (i<3) Serial.print('.');
}
Serial.println();
}
void loop() {
}
Nach dem Code hab ichs doch wieder als Array in der Variable ip, oder? Und ich wills auch nicht per Serial verschicken, das bleibt auf diesen einem Board.
Und der Fehler mit dem Pointer besteht immer noch.. ich weiß nicht, wie ich den umgehen kann..
Fipsi:
Dann hab ich jetzt aber nur noch das Pointer-Problem.
Du hast mit Pointern ein ganz gewaltiges Problem.
Und mit C-Strings.
Und mit C-Programmierung überhaupt.
Was soll das sein:
char* server_ip[15];
char* server_ip_z[15];
Das ist die Deklaration für 2*15 = 30 "Pointer auf Strings".
Und zwar Strings, die nirgendwo existieren und nirgendwo Speicherplatz reserviert haben.
Also wohl nicht das, was Du möchtest.
Wenn Du Platz für einen String von maximal 15 Zeichen Länge deklarieren möchtest, dann sieht das so aus:
char server_ip_z[16];
Reserviert wird dabei Platz für 16 chars, also 16 einzelne Zeichen.
Warum 16 und nicht 15? Weil jeder C-String als abschließendes Zeichen noch ein Nullzeichen \0 benötigt, als Zeichen für das Ende des Strings.
Wenn Du mit Chars, Strings und Pointern hantieren und in C programmieren möchtest, müßtest Du mal dringend was darüber Lernen!
Char hatte ich am Anfang schon ausprobiert, aber das ging nicht.. jetzt weiß ich warum.. wegen dem 16 statt 15 eben facepalm.
Ich weiß, dass meine Grundlagen was C betrifft, ziemlich mager sind. Das ist für mich sozusagen nur ein notwendiges Übel, das ich für mein Projekt benötige, deswegen schau ich mir nur das an, was ich auch brauch.. ich weiß, das ist nicht so optimal, aber für mehr hab ich einfach nicht die Zeit.
Zudem bin ich auch eher der "learning by doing"-Typ, also nicht vorher seitenweiße Wälzer lesen, sondern dann, wenn ich's brauch die Punkte zusammen kratzen.. und ich bin auch sehr vielen hier im Forum sehr dankbar, dass mir geholfen wird, auch wenns den ein oder anderen Nerv kostet.
Mit solchen Antworten kommste aber bald soweit, dass dir keiner mehr helfen möchte!!
Ich weis nicht, wer es erfunden hat, aber dieser "learning by doing" Mist ist der größte Fehler den man machen kann! Genauso wie es nicht möglich ist, mit Bücher wie "In 30 Tagen C lernen" (keine Ahnung ob der Titel genauso hieß), C zu verstehen
Die Grundlagen sind für JEDES Projekt erforderlich. Wenn man es sinnvoll machen möchte, dann lernt man vorher auch ausgiebig die C-Grundkenntnisse. Hat man die irgendwann grundlegend verstanden, kann man sich ans Werk mit "learning by doing" machen. Wobei ich das dann doch eher Praxis-orientiertes-Programmieren nennen würde.
Ich kann auch nicht nach Amerika reisen, nachdem ich die 6. Klasse abgebrochen hatte und davon ausgehen, dass die mich verstehen. (In meiner Schulzeit begann der Englisch-Unterricht erst in der 5. Klasse)
und ich bin auch sehr vielen hier im Forum sehr dankbar, dass mir geholfen wird, auch wenns den ein oder anderen Nerv kostet.
Wollt auch nur mal Hallo hinterlassen....
Mit Platinen und dem neuen Design alles klar? Aber wie ich dich kenne, hattest du noch keine Zeit fürs TuT.
Grundlagen ist klar dass die für jedes Projekt erforderlich sind, was sind Grundlagen?
Für den einen reicht es wenn er weiß dass es C Sprache ist, was der da vor sich hat, für den anderen ist es nach dem dritten Lehrjahr.
Jemand der >2 Berufe ausübt, hat nicht mehr viel Zeit für C übrig, möchte dennoch mit Arduino was programmieren.
Da kann man schon vom Try And Error begeistert sein
C in 30 Tagen und andere Bücher die ähnlichen Titel haben, kann man meist weiträumig umgehen.