Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.05.2008, 17:49

Arrayüberlauf Problem?

Hi ;)

ich muss gerade ein CRC Testprogramm mit gewissen Ansprüchen programmieren.

Als Basis dazu dient von wikipedia

http://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung

das erste beispiel ganz oben.

Das habe ich jetzt versucht in C (nicht c++!) zu schreiben und hab irgendwo einen speicherfehler im Speicherbereich der Variable iRemainder.

das dumme ist, der debugger hilft nicht :( der läuft bis zum ende der funktion Division durch und wenn er sie dann verlassen soll, kommt der Adressenfehler oO


wäre um jede hilfe dankbar :( ist sicherlich iwo ein kleiner denkfehler.

vl weiß auch noch einer, wie ich diese division einfacher gestalten kann, da die bei mir iwie ziemlich umfangreich ist ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <stdio.h>
#include <stdlib.h>
 
// Globals

const int g_iMessage[]={1,1,0,1,0,1,1,0,1,1};   // the message to be transferred

const int g_iPolynom[]={1,0,0,1,1};             // the generator polynom

const int g_iMessageSize = sizeof(g_iMessage)/sizeof(int);
const int g_iPolynomSize = sizeof(g_iPolynom)/sizeof(int);
const int g_iRealMessageSize = g_iMessageSize+g_iPolynomSize-1;



/*
`* FUNCTION: int* Division( void )
 *
 * PURPOSE: - divides the global g_iMessage with the global g_iPolynom
 *            and calculates the remainder
 *          - adds the remainder to the global g_iMessage
 *          - returns the real SenderMessage (g_iMessage + remainder)
 *
 * RETURN Values: returns the real SenderMessage */
int* Division( void )
{
    // Variables

    int iMessage[g_iRealMessageSize];
    int iRemainder[g_iPolynomSize];
    int iStart = 0;
    int i = 0;
    int j = 0;
    int k = g_iPolynomSize;
    int iRemainderPosition = g_iPolynomSize;
    int* iSenderMessage = NULL;
    int iSenderMessageSize = 0;

    // copy the message in the real message to be transferred

    // initialize the remainder of the division

    for( i=0; i<g_iRealMessageSize; i++ )
            iMessage[i] = g_iMessage[i];
    for( i=0; i<g_iPolynomSize; i++ )
        iRemainder[i] = 0;

    // add degree of polynom times zeroes to the end of the message

    for( i=0; i<g_iPolynomSize-1; i++ )
        iMessage[g_iMessageSize+i] = 0;

    // find the first 1 of the message to be transferred, to begin division

    for( i=0; i<g_iMessageSize; i++ )
        if( iMessage[i] == 1 )
        {
            iStart = i;
            break;
        }

    // start the divison

    for( i=iStart; i<g_iRealMessageSize; i++ )
    {
        if( k>=g_iRealMessageSize-1 )
            break;
        if( i == iStart )
        {
            // there is no remainder at the beginning

            // calculate it

            for( j=0; j<g_iPolynomSize; j++)
                iRemainder[j] = iMessage[i+j] ^ g_iPolynom[j];
            iRemainder[j] = iMessage[i+j];
        }
        else
        {
            // get the new remainder to be divided

            // find the first 1 of the remainder

            for( j=0; j<g_iPolynomSize; j++)
                if( iRemainder[j] == 1 )
                {
                    iRemainderPosition = j;
                    break;
                }
            // shift the numbers of the right hand side of the founded 1

            // to the left

            for( j=0; j<g_iPolynomSize-iRemainderPosition; j++)
                iRemainder[j] = iRemainder[iRemainderPosition+j];
            // add to the tail of the remainder the remaining numbers of the message

            for( j=g_iPolynomSize-iRemainderPosition; j<g_iPolynomSize; j++)
            {
                iRemainder[j] = iMessage[k];
                k++;
            }
            // divide the new remainder with the polynom

            for( j=0; j<g_iPolynomSize; j++)
                iRemainder[j] = iRemainder[j] ^ g_iPolynom[j];
            iRemainderPosition = g_iPolynomSize;
        }
    }

    // create the remainder by deleting heading zeroes

    for( j=0; j<g_iPolynomSize; j++)
        if( iRemainder[j] == 1 )
        {
            iRemainderPosition = j;
            break;
        }
    for( j=0; j<g_iPolynomSize-iRemainderPosition; j++)
        iRemainder[j] = iRemainder[iRemainderPosition+j];
    iRemainder[g_iPolynomSize-iRemainderPosition] = iMessage[g_iRealMessageSize-1];

    // create the real sender message to be transferred

    // by adding the remainder to the message

    iSenderMessageSize = g_iMessageSize + g_iPolynomSize-iRemainderPosition+1;
    iSenderMessage = (int*)malloc( sizeof(int) * iSenderMessageSize );
    j = 0;
    for( i=0; i < iSenderMessageSize; i++ )
    {
        if( i < g_iMessageSize )
            iSenderMessage[i] = iMessage[i];
        else
        {
            iSenderMessage[i] = iRemainder[j];
            j++;
        }
    }

    // return the real message to be transferred

    return iSenderMessage;
}


int main(void)
{   
    // Variables

    int* iSenderMessage = Division(); 
    int i = 0;

    
    printf( "Die Sender Nachricht lautet:\n" );
    //for( i=0; i<sizeof(iSenderMessage)/sizeof(int); i++ )

    //  printf("%d", iSenderMessage[i] );


    //free( iSenderMessage );


    return 0;
}



mfg
Simon

edit:

hier noch die fehlermeldung

(Link)



edit2:

k schon entdeckt,aber jetzt stimmt die divison nicht mehr ... mal schauen^^

3

28.05.2008, 18:28

1) Nein, es ist kein C!

2) Habe den Quelltext copiert und das als Ausgabe erhalten:

Quellcode

1
2
Die Sender Nachricht lautet:
1


3) Da an dem Zeiger dynamisch alloziierter Speicher haengt, liefert sizeof() nicht das gewuenschte.

Quellcode

1
2
3
4
    //for( i=0; i<sizeof(iSenderMessage)/sizeof(int); i++ )
    //    printf("%d", iSenderMessage[i] );

    //free( iSenderMessage );


4) Du kannst nicht einfach komplexen Code posten, dann sagen, du hast ein Remainder-Problem und sonst nichts. Zumal sich deine Implementation allein vom Umfang her stark von wikipedia unterscheidet.

5) Beschleunigen: Du kannst ja auf ganzen Bytes arbeiten und mit bitweisen Operationen arbeiten.

6) Warum nimmst du nicht den Code aus wikipedia?

4

28.05.2008, 22:44

Kennste beim debuggen mal durchsteppen? dann siehst du wo es kracht!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

29.05.2008, 08:51

Nein, sieht er nicht, wenn es erst im Epilog 'kracht'...
@D13_Dreinig

Werbeanzeige