/ Forside/ Teknologi / Udvikling / C/C++ / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
pointer spørgsmål
Fra : glenn007
Vist : 577 gange
50 point
Dato : 13-12-02 11:25

Jeg her en buffer pointer ( *lpBuff ) det kører derudaf, men nu vil jeg gerne have den til at smide de første 3 unsigned char efter hvert $ tegn ned i et array, hvordan er det nu man gør med den slags. evt komenteret eksempel ville være kanon lækkert, da jeg ikke har styr på dette endnu
har prøvet således men duede ikke

void udtag_emner(unsigned char*lpBuff)
{

unsigned char target[3]; // henter Byte 0,1,2,3 I alt 4 Byte/char
   while (*lpBuff=(0x24,target[*lpBuff+3])) // hvis pointer er $ hent pointer+næste 3 char
   {   

      for (int i = 0 ;i < 4;i++)
      cout << lpBuff[i];
   }
   //TODO   
}
jeg har prøvet dette men det ser ud til der er noget galt, med koden så den ikke tager de $ og de 3 næste

og en lille ting mere, nogle detr kender syntaksen til at tømme buffere, eller ved hvilken header jeg kan finde den i ? har prøvet med free(lpBuff) men det gider den ikke, og det var mit sidste bud. Selv om jeg nu nok mener det er rigtigt nok.



 
 
Kommentar
Fra : pmbruun


Dato : 16-12-02 09:09

Det er uklart hvad det er du prøver på her, men det er lysende klart at du mangler noget grundlæggende forståelse af, hvad C++ går ud på, for den kode du vedlægger er ren "goddag mand økseskaft" - undskyld jeg siger det lige ud, men du har nok ingen glæde af omsvøb.

Jeg tror ærligt talt, at du vil have gavn af et eller andet sammenhængende kursus i stedet for at forsøge at hacke dig vej ind i sproget. Du kommer altså til at knække nakken på det, for C++ er et meget vanskeligt sprog med mange spidsfindige hjørner, som du vil komme til at skære dig på, fordi du ikke har en grundlæggende forståelse af, hvad det du skriver betyder.

Faktisk bør du jo nok starte med et lidt simplere sprog end C++, måske basic eller java.

Hvis du virkelig ønsker en kvalificeret løsning på det konkrete problem, bliver du nok nødt til at bakke lidt i historien og forklare forfra, hvor dine data kom fra, hvor de skulle hen, og hvad du ville med dem.

Med venlig hilsen

Peter


Kommentar
Fra : glenn007


Dato : 17-12-02 01:56

Ja det var hårde ord, men som sagt er jeg nybegynder, og lytter meget gerne til gode råd.

ideen er at jeg fra en buffer ( lpBuff[] ) skal hente linier der begynder med $1 og lægge dem i $stream_data1[] hvor den første unsigned char ( $) skal ligge i [0] og næste [1] osv.. mine data er unsigned char*`s.
derefter skal jeg så udskrive dem til consol vinduet til aflæsning



Accepteret svar
Fra : pmbruun

Modtaget 50 point
Dato : 17-12-02 09:46

Problemet er, at C++ typen char* er næsten om ikke fuldstændig uden nogen som helst lighed med $-variable i Basic. Man kan ikke bare kaste rundt med char* variable uden en dyb forståelse af C memory allokering, strengterminering, kopieringsfunktioner, o.s.v.

Lignende problemer kan du rende ind i med dine arrays, hvis ikke du med sikkerhed kender en øvre grænse for, hvor mange $ strenge, du finder.

Indtil du har lært meget meget mere, bør du derfor sky char* og [] som pesten!

Heldigvis er der alternativer i C++ standard library. I stedet for char* bør du bruge std::string klassen, og i stedet for arrays [] bør du bruge std::vector.

Jeg kan anbefale at læse: http://www.icce.rug.nl/documents/cplusplus/
Der skulle være stof til de lange vinteraftener.

Jeg kan ikke lige se, hvor stream_data1 kommer ind i billedet. Den forekommer ikke i dit eksempel, men hvis du ikke vil outputte strengene på cout, bør du helt klart definere den som:

std::vector<std::string> stream_data1;

I mellemtiden tror jeg nok, at din kode, hvis du insisterer på at bruge char* skal indeholde noget i denne retning:

#include <string.h>
#include <strings.h>

unsigned char target[5]; // NB! erklærer target[0] til target[4], men *ikke* target[5]

// target skal termineres med et 0-tegn, ellers ved cout ikke, hvor den skal stoppe
target[4] = '\0';

while ((lpBuff = strchr(lpBuff, '$')) != 0) {
strncpy(target, lpBuff, 3);
cout << target;
lpBuff += 4;
}





Kommentar
Fra : Nyhedsbruger


Dato : 13-12-02 20:55

glenn007 <glenn007.news@kandu.dk> skrev:
> Jeg her en buffer pointer ( *lpBuff )

Hvorfor har du det? Jeg kan se af din kode (cout) at du bruger C++.

> det kører derudaf, men nu vil jeg
> gerne have den til at smide de første 3 unsigned char efter hvert $ tegn
> ned i et array, hvordan er det nu man gør med den slags. evt
> komenteret eksempel ville være kanon lækkert, da jeg ikke har styr på
> dette endnu

Beklager, jeg gider ikke lave kommenterede eksempler til anonyme.

> har prøvet således men duede ikke
>
> void udtag_emner(unsigned char*lpBuff)
> {
>
> unsigned char target[3]; // henter Byte 0,1,2,3 I alt 4 Byte/char

I det array får du nu kun plads til 3 tegn.

>    while (*lpBuff=(0x24,target[*lpBuff+3])) // hvis pointer er $ hent
> pointer+næste 3 char

Her demonstreres:
- nytteløs brug af komma-operator
- tildeling i betingelse
- læsning af array gennem ukontrolleret indeks.

Måske mener du:

while (lpBuff = strchr (lpBuff, '$'))

men hvad skal target så bruges til?

>    {   
>       for (int i = 0 ;i < 4;i++)
>       cout << lpBuff[i];

Hvorfra ved du at lpBuff[i] er inden for din buffer?

>    }
>    //TODO   
> }
> jeg har prøvet dette men det ser ud til der er noget galt, med koden så
> den ikke tager de $ og de 3 næste
>
> og en lille ting mere, nogle detr kender syntaksen til at tømme
> buffere, eller ved hvilken header jeg kan finde den i ? har prøvet med
> free(lpBuff) men det gider den ikke, og det var mit sidste bud. Selv om
> jeg nu nok mener det er rigtigt nok.

Måske hvis du forklarer hvad du egentlig mener så vi andre også kan
forstå det, og hvis du får et navn.

Kommentar
Fra : Nyhedsbruger


Dato : 14-12-02 06:08

glenn007 wrote:

> Jeg her en buffer pointer ( *lpBuff ) det kører derudaf, men nu vil jeg
> gerne have den til at smide de første 3 unsigned char efter hvert $ tegn
> ned i et array, hvordan er det nu man gør med den slags. evt
> komenteret eksempel ville være kanon lækkert, da jeg ikke har styr på
> dette endnu
> har prøvet således men duede ikke

[Snip]

>


void udtag_emner(char *lpBuff)
{
char target[5]; /* Plads til $ + tre naeste + 0 terminator */

while(*lpBuff) /* Koer loekken indtil nul karakteren er fundet */
{
if(*lpBuff == '$')
{
strncpy(target, lpBuff, 4); /* Kopier 4 char ind i target */
target[4] = '\0'; /* Nul terminer target */

printf("%s\n", target); /* Eller cout << target << endl */
}
lpBuff++;
}
}

>
> og en lille ting mere, nogle detr kender syntaksen til at tømme
> buffere, eller ved hvilken header jeg kan finde den i ? har prøvet med
> free(lpBuff) men det gider den ikke, og det var mit sidste bud. Selv om
> jeg nu nok mener det er rigtigt nok.
>

Jeg er ikke sikker på jeg forstår hvad du mener med at tømme en buffer;
hvis du allokerer memory med malloc(), realloc() eller calloc() skal
du kalde free(), ellers ikke.

Jeg forstår heller ikke hvad du mener med "det gider den ikke".


/bertel


Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177414
Tips : 31962
Nyheder : 719565
Indlæg : 6407849
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste