Forum: Mikrocontroller und Digitale Elektronik CString Variablen in C Sprache umformen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fef F. (Firma: Gast) (fef)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo an alle und Happy New Year,

Ich versuche, einen C++ Code in  C-Sprache zu umformen.
Abe ich habe Probleme mit der CString Variablen in C-Sprache zu 
übersetzen.
Kann jemand mich unterstützen? was ich falsch gemacht habe.

Danke

/*Hier is the C++ code */

    CString m_Message = _T("BBBBBBBBBBBBBBBB");
    CString TempBits;
    int i;
    int iLen=m_Message.GetLength();
    char cMessage[2048];
    ZeroMemory(cMessage, 2048);
    strcpy(cMessage, m_Message.GetBuffer(0));
    for (i=0; i<iLen; i++)
    {
        char c=cMessage[i];
        for (int j=0; j<128; j++)
            if (ASCII7BitTable[j].Letter==c)
            {
                CString TempStr=ASCII7BitTable[j].Bits;
                TempStr.MakeReverse();
                TempBits+=TempStr;
                break;
            }
    }

/*Hier ist das Umformen in c language.
Es taucht einen Fehler in die Stelle TempStr = ASCII7BitTable[j].Bits;
auf.
*/

char m_Message[] = "BBBBBBBBBBBBBBBB";
    char *TempBits;
    int i;
    int iLen = strlen(m_Message);
    char cMessage[2048];
    memset(cMessage,0, 2048);
    strcpy(cMessage, m_Message);
    for (i=0; i<iLen; i++)
    {
        char c = cMessage[i];
        int j;
        for (j=0; j<128; j++)
        if (ASCII7BitTable[j].Letter == c)
        {
             char TempStr[] = "";
            TempStr = ASCII7BitTable[j].Bits;
            strrev(TempStr);
            TempBits += TempStr;

            break;
        }
    }

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
> Es taucht einen Fehler ... auf.

Welcher denn? Und wo ist der Quelltext von ASCII7BitTable? Wenn du Hilfe 
haben willst, musst du uns schon ein komplettes compilierbares Programm 
zeigen, oder die konkrete Fehlermeldung.

: Bearbeitet durch User
von Fef F. (Firma: Gast) (fef)


Bewertung
0 lesenswert
nicht lesenswert
Hi,

der ganze Code ist sehr riesig. Deshalb habe ich nur die Stelle wo ich 
Probleme habe, gezeigt.
hier ist das ASCII7BitTable.

  typedef struct tagASCII7Bit
  {
    char Letter;
    char Bits[8];
  } ASCII7Bit;

  extern ASCII7Bit ASCII7BitTable[128];

ASCII7Bit ASCII7BitTable[128]=
{
  {0, "0000000"},      //NULL
  {1, "0000001"},
  {2, "0000010"},
  {3, "0000011"},
  {4, "0000100"},
  {5, "0000101"},
  {6, "0000110"},
  {7, "0000111"},
  {8, "0001000"},
  {9, "0001001"},
  {10, "0001010"},
  {11, "0001011"},
  {12, "0001100"},
  {13, "0001101"},
  {14, "0001110"},
  {15, "0001111"},
  {16, "0010000"},
  {17, "0010001"},
  {18, "0010010"},
  {19, "0010011"},
  {20, "0010100"},
  {21, "0010101"},
  {22, "0010110"},
  {23, "0010111"},
  {24, "0011000"},
  {25, "0011001"},
  {26, "0011010"},
  {27, "0011011"},
  {28, "0011100"},
  {29, "0011101"},
  {30, "0011110"},
  {31, "0011111"},
  {' ', "0100000"},
  {'!', "0100001"},
  {'\"',"0100010"},
  {'#', "0100011"},
  {'$', "0100100"},
  {'%', "0100101"},
  {'&', "0100110"},
  {'\'',"0100111"},
  {'(', "0101000"},
  {')', "0101001"},
  {'*', "0101010"},
  {'+', "0101011"},
  {',', "0101100"},
  {'-', "0101101"},
  {'.', "0101110"},
  {'/', "0101111"},
  {'0', "0110000"},
  {'1', "0110001"},
  {'2', "0110010"},
  {'3', "0110011"},
  {'4', "0110100"},
  {'5', "0110101"},
  {'6', "0110110"},
  {'7', "0110111"},
  {'8', "0111000"},
  {'9', "0111001"},
  {':', "0111010"},
  {';', "0111011"},
  {'<', "0111100"},
  {'=', "0111101"},
  {'>', "0111110"},
  {'?', "0111111"},
  {'@', "1000000"},
  {'A', "1000001"},
  {'B', "1000010"},
  {'C', "1000011"},
  {'D', "1000100"},
  {'E', "1000101"},
  {'F', "1000110"},
  {'G', "1000111"},
  {'H', "1001000"},
  {'I', "1001001"},
  {'J', "1001010"},
  {'K', "1001011"},
  {'L', "1001100"},
  {'M', "1001101"},
  {'N', "1001110"},
  {'O', "1001111"},
  {'P', "1010000"},
  {'Q', "1010001"},
  {'R', "1010010"},
  {'S', "1010011"},
  {'T', "1010100"},
  {'U', "1010101"},
  {'V', "1010110"},
  {'W', "1010111"},
  {'X', "1011000"},
  {'Y', "1011001"},
  {'Z', "1011010"},
  {'[', "1011011"},
  {'\\', "1011100"},
  {']', "1011101"},
  {'^', "1011110"},
  {'_', "1011111"},
  {'`', "1100000"},
  {'a', "1100001"},
  {'b', "1100010"},
  {'c', "1100011"},
  {'d', "1100100"},
  {'e', "1100101"},
  {'f', "1100110"},
  {'g', "1100111"},
  {'h', "1101000"},
  {'i', "1101001"},
  {'j', "1101010"},
  {'k', "1101011"},
  {'l', "1101100"},
  {'m', "1101101"},
  {'n', "1101110"},
  {'o', "1101111"},
  {'p', "1110000"},
  {'q', "1110001"},
  {'r', "1110010"},
  {'s', "1110011"},
  {'t', "1110100"},
  {'u', "1110101"},
  {'v', "1110110"},
  {'w', "1110111"},
  {'x', "1111000"},
  {'y', "1111001"},
  {'z', "1111010"},
  {'{', "1111011"},
  {'|', "1111100"},
  {'}', "1111101"},
  {'~', "1111110"},
  {127, "1111111"}  //DEL
};

Ich möchte wiessen, ob ich die CString Variable von C++ in C-Sprache 
richtig umgeformt habe.
Der Fehler liegt in deiser Stelle : TempStr = ASCII7BitTable[j].Bits;

von Dirk B. (dirkb2)


Bewertung
0 lesenswert
nicht lesenswert
Du kannst in C kein Array mit = zuweisen.
Du musst die Daten kopieren.
Dafür gibt es aber fertige Funktionen.

Bei TempBits += TempStr; ist auch noch ein Fehler.

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
In der inneren Schleife fehlt geschätzt 90% des Codes, den die C++ 
Varinate implizit aufruft.

Hinweise:
1
CString TempStr=ASCII7BitTable[j].Bits;
2
TempStr.MakeReverse();

TempStr ist vermutlich eine Kopie der Daten aus Bits, damit 
MakeReverse() nicht die Originaldaten ändert.

Das naive
1
     char * TempStr = ASCII7BitTable[j].Bits;
2
            strrev(TempStr);
würde vermutlich die Originaldaten ändern, also brauchst Du einen 
temporären Puffer.


Noch schlechter ist
1
 
2
TempBits += TempStr;

Das geht in C so gar nicht und müsste über strcpy() gelöst werden. 
Problem: TempStr muss dabei in der Größe änderbar (oder vorher groß 
genug) sein, also wären Puffergrenzen zu beachten. In der C++ Variante 
wird implizit mit realloc() gearbeitet.

: Bearbeitet durch User
von Fef F. (Firma: Gast) (fef)


Bewertung
0 lesenswert
nicht lesenswert
ich bedanke mich für deine prompte Antwort.

kannst du Bitte mich ein Beispiel mit diesem fertigen Funktion zeigen ?

von Daniel A. (daniel-a)


Bewertung
0 lesenswert
nicht lesenswert
Der Abschnitt ist vielleicht Ineffizient...

Ich würde das so schreiben:
1
#include <stdio.h>
2
#include <string.h>
3
#include <stddef.h>
4
5
int main( void ){
6
  const char message[] = "BBBBBBBBBBBBBBBB";
7
  size_t message_len = strlen(message);
8
  char temp_bits[ message_len * 8 + 1 ];
9
  temp_bits[ message_len * 8 ] = 0;
10
  for( size_t i=0; i<message_len; i++ ){
11
    unsigned char c = message[i];
12
    for( int j=0; j<8; j++ )
13
      temp_bits[ i*8 + j ] = ( ( c >> (7-j) ) & 1 ) ? '1' : '0';
14
  }
15
  puts(temp_bits);
16
  return 0;
17
}

: Bearbeitet durch User
von Rainer V. (rudi994)


Bewertung
0 lesenswert
nicht lesenswert
Fef F. schrieb:
> char TempStr[] = "";
> TempStr = ASCII7BitTable[j].Bits;
> strrev(TempStr);

Das funktioniert bei mir in CodeBlocks mit MinGW überhaupt nicht!

char TempStr[] = ""; ist ein Array für 1 char, sizeof() liefert Größe 1, 
also kein Platz für mehr als z.B. ein Nullterminierungszeichen.

TempStr = ASCII7BitTable[j].Bits; verursacht Fehler beim Compilieren:
incompatible types when assigning to type 'char[1]' from type 'char*'

TempStr[0] = ASCII7BitTable[j].Bits; wäre fehlerfrei compilierbar, 
ergibt aber wohl keinen Sinn. Im Gegensatz zu folgendem:
char *TempStr; TempStr = (char*) &ASCII7BitTable[j].Bits;

Anschließendes strrev(TempStr) ändert die Werte in der Originaltabelle. 
Wenn das unerwünscht ist, müßte man also mit einer Kopie arbeiten. LG

von Fef F. (Firma: Gast) (fef)


Bewertung
0 lesenswert
nicht lesenswert
Hier ist der C++ Code von A.Riazi, der ich auf einem LCD-Display in C 
bearbeiten muss.

#include "7BitASCII.h"

#define POCSAG_PREAMBLE_CODEWORD    0xAAAAAAAA
#define POCSAG_IDLE_CODEWORD        0x7A89C197
#define POCSAG_SYNCH_CODEWORD        0x7CD215D8

union  Packet
{
    int  iPacket;
    char cPacket[4];
};

typedef struct tagASCII7Bit
{
    char Letter;
    char Bits[8];
} ASCII7Bit;

extern ASCII7Bit ASCII7BitTable[128];

void CPOCSAGDlg::OnCalculate()
{
    UpdateData(TRUE);

    int i;
    int iPOCSAGMsg[68];
    CBCHEncoder m_bch;

    int iReciever=atoi(m_Reciever.GetBuffer(0));

    //Reset the codewords
    for (i=0; i<68; i++)
        iPOCSAGMsg[i]=POCSAG_IDLE_CODEWORD;

    //Initilizing Synch Codewords
    for (i=0; i<68; i+=17)
        iPOCSAGMsg[i]=POCSAG_SYNCH_CODEWORD;

    //compute address codeword
    int iStartFrame=iReciever%8;

    int iAddress=iReciever >> 3;
    iAddress=iAddress<<2;
    iAddress|=0x3;
    iAddress=iAddress<<11;

    m_bch.SetData(iAddress);
    m_bch.Encode();
    int iAddressEnc=m_bch.GetEncodedData();

    iPOCSAGMsg[iStartFrame*2+1]=iAddressEnc;

    //computer message codeword
    CString TempBits;
    int iLen=m_Message.GetLength();
    char cMessage[2048];
    ZeroMemory(cMessage, 2048);
    strcpy(cMessage, m_Message.GetBuffer(0));

    for (i=0; i<iLen; i++)
    {
        char c=cMessage[i];

        for (int j=0; j<128; j++)
            if (ASCII7BitTable[j].Letter==c)
            {
                CString TempStr=ASCII7BitTable[j].Bits;
                TempStr.MakeReverse();
                TempBits+=TempStr;
                break;
            }
    }

    //EOT = End of Transmission
    CString TempStr=ASCII7BitTable[4].Bits;
    TempStr.MakeReverse();
    TempBits+=TempStr;

    //now we have bits of message!
    int iMessageCodewords=(iLen+1)*7/20;

    if (iMessageCodewords*20!=(iLen+1)*7)
        iMessageCodewords++;

    int iRemainBit=iMessageCodewords*20-7*(iLen+1);
    float fRemain=ceil((float) iRemainBit/7);
    iRemainBit=(int) fRemain;

    for (i=0; i<iRemainBit; i++)
    {
        TempStr=ASCII7BitTable[4].Bits;
        TempStr.MakeReverse();
        TempBits+=TempStr;
    }

    iRemainBit=TempBits.GetLength()%20;

    //must remove iRemainBits from right of string
    TempBits=TempBits.Left(TempBits.GetLength()-iRemainBit);

    std::bitset<2100> MsgBits(TempBits.GetBuffer(0));

    int k=TempBits.GetLength()-1;

    int iCodeword=1;

    for (i=k; i>=0; i-=20)
    {
        int iMsgCode=1<<31;
        //0x80000000

        for (int j=0; j<20; j++)
        {
            if (i-j>=0)
                iMsgCode|=MsgBits[i-j]<<(30-j);
        }

        m_bch.SetData(iMsgCode);
        m_bch.Encode();

        iMsgCode=m_bch.GetEncodedData();

        if ((iStartFrame*2+1+iCodeword)%17==0)
            iCodeword++;

        iPOCSAGMsg[iStartFrame*2+1+iCodeword]=iMsgCode;

        iCodeword++;
    }

    //now update display
    CString szRes;
    CString szTemp;
    for (i=0; i<68; i++)
    {
        szTemp.Format("%X   ", iPOCSAGMsg[i]);
        szRes+=szTemp;

        if (i%17==0)
            szRes+=CString("\r\n");

        if (i%17==8 || i%17==16)
            szRes+=CString("\r\n");
    }

    m_EncodedMessage=szRes;

    UpdateData(FALSE);
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.