Problem mit String

Gast #1704545
Lesenswert?

Hey

Ich glaub ich sitz grad total auf der Leitung. Hab in der eingefügten 
Schleife nur ein paar Comments hinzugefügt und auf einmal funktioniert 
sie nicht mehr. Anscheinend ist irgendwas schief gelaufen, aber ich find 
den Fehler einfach nicht.

Folgendes Problem: Mein char- Feld bekommt die ersten acht Werte 
korrekt. Dann sollte das Feld eigentlich zu Ende sein, aber irgendwie 
werden noch drei Nullen dazugefügt, auf insgesamt 11 Stellen.

Das Tolle dabei ist ja, dass genau diese Schleife nur mit anderen 
Variablennamen vorher im Programm verwendet wird-und auch funktioniert.
Ich hoffe ihr könnt mir helfen.

jens
Angehängte Dateien:
Gast #1704557
Lesenswert?

Nein, Missverständnis.
ind wird vorher schon verwendet.
Zur Erklärung: Ich habe ein Feld von 128 Elementen und ind bestimmt den 
Index in diesem Feld. Dieses große Feld wird nun in kleinere Felder 
aufgeteilt.

Also der Vollständigkeit halber:
1
void test()
2
{
3
int i, l;
4
int ind;
5
unsigned char simData[8];
6
ind = 100;                //Globale Variable
7

8
for(i = ind, l = 0; i<(ind+8), l<8; l++, i++)
9
{
10
  if(signal[i] == 0)
11
  {
12
    simData[l] = '0';
13
  }
14
  else
15
  {
16
    simData[l] = '1';
17
  }
18
}
19
}
Es muss was anderes sein.

jens
Gast #1704573
Lesenswert?

Steht deine Funktion so im Programm?
Dann kann das nicht gehen weil "ind" dann eine lokale Variable in der 
Funktion ist! Wenn du außerhalb der Funktion "Test()" eine Variable hast 
die auch "ind" heißt hat die nicht das geringste mit der in der Funktion 
zu tun ;)
Gast #1704578
Lesenswert?

der schrieb:
> Steht deine Funktion so im Programm?
> Dann kann das nicht gehen weil "ind" dann eine lokale Variable in der
> Funktion ist! Wenn du außerhalb der Funktion "Test()" eine Variable hast
> die auch "ind" heißt hat die nicht das geringste mit der in der Funktion
> zu tun ;)

hab was übersehen, sorry passt schon so ;)
Gast #1704600
Lesenswert?

Klaus Wachtler schrieb:
> Und welche 128 Feldelemente?
> Redest du über das Programm, das du hier zeigst?
Das Problem ist, dass das Programm in der VirtualBox programmiert wird 
und ich zurzeit den Quelltext nicht hierherkopieren kann. Sorry dafür.

Also nochmal zur Erklärung:
Eine Funktion analyze() enthält drei der oben gezeigten Schleifen, die 
ein char- Feld (global, 128 Elemente) in drei kleine Felder (lokal, 8 
Elemente) aufteilen.

Die Schleife ist kopiert, also genau dreimal gleich, bis eben auf die 
Variablennamen. Zusätzlich wird natürlich auch immer der Index vom 
Hauptfeld erhöht.

Eine dieser Schleifen wurde in der Funktion test dargestellt, hier im 
Post, damit ein wenig Vollständigkeit herrscht und nicht die 
Codesegmente herumfliegen.

Weitere Eingrenzung des Fehlers:
1
i<(ind+7), l<7
funktioniert einwandfrei, nur eben mit sieben Elementen.
#1704603
Lesenswert?

Dann such deinen Fehler selbst.
In einem Programm, das ich nicht sehe, kann ich keine
Fehler finden, dafür bin ich zu doof. Frag Rüttgers, der kann alles.

Meine stille Vermutung ist immer noch, daß du die Terminierung
vergisst, aber das ist Spekulation - wie alles hier, solange kein 
Programm auf dem Tisch liegt.

Gute Nacht!

jens schrieb:
> ... damit ein wenig Vollständigkeit herrscht und nicht die
> Codesegmente herumfliegen.

haha
Gast #1704610
Lesenswert?

Danke.
Der Grund, warum ich überhaupt ohne Code angefragt habe, ist, dass ich 
gedacht habe, es ist ein kleiner allgemeiner Fehler. Wenn du zB hörst, 
es werden drei Nullen zum String hinzugefügt, dachte ich mir, vielleicht 
ist das ein Zeichen für einen bestimmten Fehler, der dir bekannt ist.

Ich habe auch keine genauen Lösungen gefordert, sondern Vorschläge, was 
falsch sein könnte. Und deinem mit der Terminierung werd ich nachgehen.

Das nicht der ganze Code verfügbar ist, dafür hab ich mich entschuldigt, 
es geht im Moment einfach nicht. Aber man wird ja wohl noch fragen 
dürfen.

jens
#1704618
Lesenswert?

ja, und die einzige Vermutung, die ich abgeben kann, ist
die, daß du das char-Feld anschließend als String nimmst, obwohl
evtl. die abschließende Null fehlt.
Das ist schon Spekulation, aber halt ein typischer Standardfehler.
Mehr kann ich dazu nicht sagen. Alles weitere wäre nicht
Spekulation, sondern wilde Spekulation.
Wenn dein Word abstürzt, kann ich dir auch nicht sagen, in
welcher Quelltextzeile das ist.
Gast #1704624
Lesenswert?

wobei diese zeile :
1
for(i = ind, l = 0; i<(ind+8), l<8; l++, i++)
mal irgendwie eine vergewaltigung ist ^^

ein
1
unsigned char l = 0;
2
for(i = ind ; i<(ind+8); i++)
3
{
4
  if(signal[i] == 0)
5
  {
6
    simData[l++] = '0';
7
  }
8
  else
9
  {
10
    simData[l++] = '1';
11
  }
12
}

tuts doch auch oder verwechlse ich grad was ?
#1704641
Lesenswert?

möööp schrieb:
> tuts doch auch oder verwechlse ich grad was ?

ja, das tut's auch.
Ich finde es aber nicht elegant, weil man die Funktionalität
der Schleife nicht mehr kopmpakt im for hat, sondern mehr oder
weniger mühsam suchen muß.
Ok, das Suchen ist hier nicht schwer, aber zumindest bei etwas
aufwendigeren Konstruktionen mag ich so versteckte ++ nicht recht.

Stefan Ernst schrieb:
> Ich würde es mit nur einer Schleifenvariablen machen:

Das ist sicher die bessere Variante.
Gast #1704771
Lesenswert?

Klaus Wachtler schrieb:
> ja, das tut's auch.
> Ich finde es aber nicht elegant, weil man die Funktionalität
> der Schleife nicht mehr kopmpakt im for hat, sondern mehr oder
> weniger mühsam suchen muß.
> Ok, das Suchen ist hier nicht schwer, aber zumindest bei etwas
> aufwendigeren Konstruktionen mag ich so versteckte ++ nicht recht.


naja stimmt schon
aber das for konstrukt sieht so
1
for(i = ind, l = 0; i<(ind+8), l<8; l++, i++)
unübersichtlicher aus
finde ICH jedenfalls

wobei mir
1
for (uint8_t i = 0; i < 8; i++)
2
{
3
  if(signal[ind+i] == 0)
4
  {
5
    simData[i] = '0';
6
  }
7
  else
8
  {
9
    simData[i] = '1';
10
  }
11
}

besser gefällt
ich bin noch nicht so lange am programmieren
ein anderer würde vlt noch anders lösen ^^


aber gerade die verrückten sachen machen in C spass :)
siehe funktionszeiger und so ..
Gast #1704789
Lesenswert?

jens schrieb:
> Weitere Eingrenzung des Fehlers:i<(ind+7), l<7
> funktioniert einwandfrei, nur eben mit sieben Elementen.

und unsigned char simData[8];
macht mich stutzig

die abbruchbedingen scheint nicht zustimmen und er schreibt vieleicht
in simData[8] was rein .. was leider nicht geht .. da es nur ein array 
mit 8 elementen ist 0 .. 7

aus diesem grunde verteufle ich das verschachtelte for konstukt ^^
und würde die variante von Stefan Ernst bevorzugen

 ^^
Gast #1704855
Lesenswert?

So, nun habe ich endlich den Quelltext aus der VirtualBox bekommen.
Hab gestern noch ein wenig herumprobiert, jetzt habe ich beim 
addressByte das gleiche Problem wie beim simData, es werden zum String 
drei Nullen dazugehängt.
adData funktioniert dagegen einwandfrei.
Hinweis:
Es ist nicht sehr schön programmiert, das kommt erst. Also bitte keine 
Einwürfe diesbezüglich. Bin im Moment nur an der schnellen Lösung des 
String- Problems interessiert.

jens
Angehängte Dateien:
Gast #1705021
Lesenswert?

Klaus Wachtler schrieb:
> Seit einem Tag läufst du hier ohne Terminierung rum und wunderst dich.
Ich habs ja schon mal probiert mit neun Elementen und '\0'. Aber es hat 
trotzdem nicht funktioniert.
Das komische ist ja, das adDataByte auch ohne die vermeintliche 
Terminierung geht. Warum soll das dann auf einmal nicht mehr gehen?

Hab das Problem aber schon gelöst. Einfach für adDataByte und 
simDataByte nur ein Feld dataByte genommen und jetzt funktionierts.
Danke für die Hilfe.

jens
#1705059
Lesenswert?

jens schrieb:
> Das komische ist ja, das adDataByte auch ohne die vermeintliche
> Terminierung geht. Warum soll das dann auf einmal nicht mehr gehen?

Das ist einfach Glückssache:
Wenn vorher in dem Byte zufällig eine Null steht (durch vorige
Verwendung oder $(MYGOOD)es FÜgung), dann klappt es.
Ansonsten geht der String scheinar soweit, bis irgendwo dahinter
im Speicher eine 0 steht.
#1705741
Lesenswert?

jens schrieb:
> Klaus Wachtler schrieb:
>> Seit einem Tag läufst du hier ohne Terminierung rum und wunderst dich.
> Ich habs ja schon mal probiert mit neun Elementen und '\0'.

Das Problem ist, das du 'probierst'.

Wenn du ein Problem siehst, dann behebe es. Aber tu das, in dem du das 
Problem analysierst, dein Wissen einsetzt, und es behebst.

Aber hör auf zu 'probieren'.

> Aber es hat
> trotzdem nicht funktioniert.

Dann wartet mglw. schon der nächste Fehler in den Startlöchern?

> Hab das Problem aber schon gelöst. Einfach für adDataByte und
> simDataByte nur ein Feld dataByte genommen und jetzt funktionierts.

Fehler kaschieren ist keine Problemlösung.

Lies wenigstens die Minimalversion dessen, was du eigentlich über 
Strings aus deinen Büchern wissen solltest.
http://www.mikrocontroller.net/articles/FAQ#Wie_funktioniert_String-Verarbeitung_in_C.3F

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren