Speicheranordnung, Denkfehler beim Pitch?

16/11/2007 - 16:10 von Robert W. Kuhn | Report spam
Hallo,

Situation: Ich habe einen PC und so ein kleines Evaluation-Board von TI.
Nun will ich Daten vom Typ unsigned char vom PC zum DSP senden. Klappt
auch soweit.

Nun wollte ich mal die "Datenintegritàt" überprüfen und habe den
Datenblock, bevor ich ihn vom PC absende, mit Daten gefüllt:

#define WIDTH 966
#define HEIGHT 600
#define IMAGE_SIZE (WIDTH*HEIGHT)

unsigned char *image=new unsigned char[IMAGE_SIZE];
unsigned char val=0;
for(int y=0; y<HEIGHT; y++)
{
unsigned char *ptr=image+y*WIDTH;

for(int x=0; x<WIDTH; x++)
{
ptr[x]=val;
}
val++;
if(val= 0) val=0;
}

Nachdem ich auf dem DSP die Daten empfangen habe, überprüfe ich diese:

int y,x;
unsigned char *arraydata, *ptr;
arraydata= (unsigned char*)malloc(IMAGE_SIZE);
for(y=0; y<HEIGHT; y++)
{
ptr=arraydata+y*WIDTH;
for(x=0; x<WIDTH; x++)
{
if(ptr[x]!=val)
{
printf("BildFehler: y: %i x: %i (soll: %i ist: %i)", y, x, y,
ptr[x]);
}
}
val++;
if(val= 0) val=0;
}

Wenn jetzt die Größe des Arrays (IMAGE_SIZE) durch 4 teilbar ist, stimmt
alles. Ist sie allerdings nicht durch 4 teilbar (wie hier jetzt), sind
die letzten beiden Werte jeder Zeile falsch:

BildFehler: y: 0 x: 964 (soll: 0 ist: 1)
BildFehler: y: 0 x: 965 (soll: 0 ist: 1)
BildFehler: y: 2 x: 964 (soll: 2 ist: 3)
BildFehler: y: 2 x: 965 (soll: 2 ist: 3)

Das kann ich mir nicht so recht erklàren. Woran kann das liegen? Wird
irgendwo auf volle Bytes oder so gerundet beim Speicherlayout? Dann
müsste das ja dort passieren, wo ich mir den Anfang der Zeile hole
(ptr=arraydata+y*WIDTH;), oder?

Danke und Tschau - Robert.
 

Lesen sie die antworten

#1 Marcel Müller
16/11/2007 - 23:42 | Warnen spam
Hallo,

Robert W. Kuhn schrieb:
Nun wollte ich mal die "Datenintegritàt" überprüfen und habe den
Datenblock, bevor ich ihn vom PC absende, mit Daten gefüllt:


[...]
Nachdem ich auf dem DSP die Daten empfangen habe, überprüfe ich diese:

int y,x;
unsigned char *arraydata, *ptr;
arraydata= (unsigned char*)malloc(IMAGE_SIZE);
for(y=0; y<HEIGHT; y++)
{
ptr=arraydata+y*WIDTH;
for(x=0; x<WIDTH; x++)
{
if(ptr[x]!=val)
{
printf("BildFehler: y: %i x: %i (soll: %i ist: %i)", y, x, y,


^
Das dürfte ein Fehler sein.

ptr[x]);
}
}
val++;
if(val= 0) val=0;
}

Wenn jetzt die Größe des Arrays (IMAGE_SIZE) durch 4 teilbar ist, stimmt
alles. Ist sie allerdings nicht durch 4 teilbar (wie hier jetzt), sind


^^^^^^^^^^^^^^
Das bezweifle ich, denn bereits einer der Faktoren, die 600, ist durch 4
Teilbar.

die letzten beiden Werte jeder Zeile falsch:



Das bezweifle ich auch, denn bei dem Auszug unten fehlt die Zeile 1.

BildFehler: y: 0 x: 964 (soll: 0 ist: 1)


^
Folgefehler.

BildFehler: y: 0 x: 965 (soll: 0 ist: 1)
BildFehler: y: 2 x: 964 (soll: 2 ist: 3)
BildFehler: y: 2 x: 965 (soll: 2 ist: 3)

Das kann ich mir nicht so recht erklàren. Woran kann das liegen?



Ich tippe auf Programmfehler außerhalb der gezeigten Source.

Wird
irgendwo auf volle Bytes oder so gerundet beim Speicherlayout?



Das wird ganz sicher gemacht...

Dann
müsste das ja dort passieren, wo ich mir den Anfang der Zeile hole
(ptr=arraydata+y*WIDTH;), oder?



... alleine es fehlt die Wirkung, wenn man mit ganzen Zahlen rechnet.


Marcel

Ähnliche fragen