31. august 2007 - 19:11Der er
41 kommentarer og 1 løsning
Fejl overskrivning af array
Hej C eksperter,
Jeg er ved at få grå hår af det her problem, jeg er ikke vant til at kode i C, men kan dog formåe at bikse lidt sammen ud fra min viden fra andre sprog.
Problemet er at mit array exonLoc bliver overskrevet med andet data. Jeg har forsøgt at udskrive noget data rundt omkring i mine if-sætninger og de kører som de skal.
Her er et skærmbillede af hvordan data tager sig ud mens den gennemgår filen og hvordan det tager sig ud bagefter når jeg gennemgår array'et i en for-løkke; http://ahv.dk/ss.jpg
Ja min compiler klager godt nok over det, men kører det alligevel. Kan du forklare hvad det betyder? Jeg har blot ladet det være fordi jeg ikke viste hvordan jeg løste det og hvad det betyder.
Jeg har prøvet at finde ud af hvor fejlen er. Det ser ud til at det er i find funktionen. Når den køres med korrekt xml tag, men indholdet ikke er ok går det galt.
Når jeg kører for-løkken, hvor jeg vil have den til at udskrive positionerne som anført i min tidligere kommentar skriver den som det kan ses på billedet fra første post bare polyA_site, hvilket er indholdet af et INSDFeature_key.
Jeg ønsker at hive start og slut positioner ud af det dokument når INSDFeature_key tag'et indeholder exon.
* find bør nok returnere 0/1 (false/true) fremfor strenge
* er det virkeligt status og ikke tmp som du vil gemme i exonLoc ??
* find vil crashe hvis end tag ikke findes
Det sidste skal løses med enten at returnere hvis p2 er NULL eller ved at få læst hele filen ind inden du parser (jeg antager at alle tags i filen er afsluttet).
Problemet er der endnu. Hvordan kan det være at find laver bøvl med array'et? Hvis jeg bare giver mit array en statisk værdi find ikke bliver kørt er alt som det burde være. Er det mon strncpy som laver noget bøvl?
Jeg vil gerne have positionsintervallet ud hver gang der har været; <INSDFeature_key>exon</INSDFeature_key>.
Når den linie har været der kommmer positionsintervallet et par linier efter f.eks; <INSDInterval_from>437</INSDInterval_from> <INSDInterval_to>875</INSDInterval_to>
Der kan være et vilkårligt antal exon's (i den givne xml fil er der 6) og dermed et vilkårligt antal intervaller.
Intervallerne skal bruges til at klippe i <INSDSeq_sequence></INSDSeq_sequence> som indeholder en lang sekvens. De opdelte sekvensstykker vil jeg gerne have i et array.
Jeg har løst problemet, hvis jeg konverterer fra char til int på tmp virker det, hvorfor ved jeg ikke og hvorfor jeg prøvede ved jeg egentlig heller ikke. Jeg vil meget gerne se, hvis du har skrevet noget som virker.
Jeg har rettet til; exonLoc[i][0] = atoi(tmp); og exonLoc[i][1] = atoi(tmp);
Der er dog stadig et problem, som jeg håber på du har en forklaring og løsning til. Hvorfor overskriver den i array'et, hvis jeg ikke laver en konvertering med atoi? Lad os f.eks. antage at jeg havde noget tekst istedet for. Hvordan skal det konverteres for at den ikke overskriver?
Hvis jeg skulle gætte på hvad der går galt, så er det fordi du bare gemmer en pointer til data som genbruges i.s.f. at strcpy/strncpy data til en ny buffer.
Såfremt at jeg kan få en tekststreng ind i mit array, ville jeg da gerne se en sådan løsning. Jeg har dog aldrig rodet med C++, men jeg kan sikkert sjusse mig frem til noget, når jeg ser noget andet kode.
Problemet med min egen kode er nu, at den sekvens jeg prøver at smide ind i mit array bliver overskrevet, som det var problemet tidligere med intervallerne.
Jeg har ikke lavet funktioner i min egen kode, da jeg egentlig bare gerne ville have det til at virke først. Så kan jeg altid pynte på koden senere.
Man kan lave det samme fnadderi i C++ som i C hvis man vil, men hvis man bruger nogle mere high level konstruktioner som STL (string og vector i eksemplet), så undgår man en del problemer.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.