Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
... ho aggiunto solo una piccola cosa per riuscire a vederne i risultati, che poi è stata la causa dell'errore......
Imparare significa
1) chiedersi ... è possibile che mi abbiano suggerito un codice sbagliato?
2) leggere e rileggere i messaggi d'errore ... (che poi era uno solo ...)
3) scoprire, con meraviglia, che si riferisce all'unica linea aggiunta ...
4) chiedersi il perché e cercare di eliminare il problema
ma SOPRATTUTTO
chiedersi ... che "metodo" ha usato questo che mi ha suggerito il codice? Cosa vuol dire
char *txt = mem+(*((short *)(mem+24)));
??
Puo' darsi che questo metodo mi possa aiutare ?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
si in effetti avrei anche voluto chiedertelo, in effetti non sono proprio sicuro di averne interpretato il significato...
e comunque ve l'ho detto che non ho molta dimestichezza sugli argomenti che non siano basilari, senza contare che uso un compilatore diverso da prima da poche ore...
in fin dei conti sn ankora nabbo per certe cose...
Ultima modifica effettuata da Roxas75 il 01/07/2011 alle 21:16
Postato originariamente da Roxas75: EDIT: ugualmente, ci sono tornato su dopocena e ho modificato il tuo codice, aggiungendo un ciclo e la possibilità di prendere tutte le stringhe...
però a un certo punto la stringa inizia a riempirsi di errori e mostra simboli incomprensibili...
Quale codice hai usato? Cosa hai aggiunto?
Testo quotato
se sei disposto ankora ad aiutarmi te ne sarei grato, altrimenti grazie comunque per l'aiuto!^^
Guarda questo esempio
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
FILE*f =fopen("input.ctd", "rb");
fseek(f, 0, SEEK_END);
int sz =ftell(f);
char*mem =(char*)malloc(sz);
fseek(f, 0, SEEK_SET);
int r =fread(mem, sizeof(char), sz, f);
fclose(f);
int limit =*((short*)(mem+0x14));
int ix =0x18;
int next =*((short*)(mem+ix));
while(ix<limit)
{
char*txt = mem+next;
printf("%X -> %X : %s\n", ix, txt-mem, txt);
ix +=0x0C;
next =*((short*)(mem+ix));
}
free(mem);
return0;
}
Ultima modifica effettuata da nessuno il 02/07/2011 alle 11:54
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
Postato alle 21:04
Sabato, 02/07/2011
Qual'è la stringa alla quale sbaglia?
(Domanda alquanto lecita....)
Hai provato a vedere manualmente qual'è il valore sul file?
Es: sul file che hai condiviso su mediafire qual'è la stringa alla quale si blocca e il puntatore ad essa?
Scusate l'attesa, ma ero fuori casa tutto ieri...
Ugualmente, posto qui il codice che usavo io.
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <fstream>
#include <malloc.h>
#include <stdlib.h>
int main()
{
FILE*f;
FILE*o;
f =fopen("in", "r");
o =fopen("out.txt", "w");
int counter =0;
fseek(f, 0, SEEK_END);
int sz =ftell(f);
char*txt;
char*mem;
mem =(char*)malloc(sz);
int localize =36;
while(counter < 200)
{
mem =(char*)malloc(sz);
fseek(f, 0, SEEK_SET);
fread(mem, sizeof(char), sz, f);
txt = mem+(*((short*)(mem+localize)));
counter++;
fprintf(o, "%d-%s\n", counter, txt);
free(mem);
txt ="\0";
localize+=12;
}
return0;
}
Ho provato il codice consigliatomi, e va alla perfezione! Vorrei però chiarire un paio di dubbi che mirimangono, se avete la possibilità di spiegarmeli...
Riscrivo qui sotto il codice di nessuno e metto delle freccette sulle righe che misembrano dubbie.
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
FILE*f =fopen("in", "rb");
fseek(f, 0, SEEK_END);
int sz =ftell(f);
char*mem =(char*)malloc(sz);
fseek(f, 0, SEEK_SET);
int r =fread(mem, sizeof(char), sz, f);
fclose(f);
int limit =*((short*)(mem+0x14));<-----non capisco short* etc...
int ix =0x18;
int next =*((short*)(mem+ix));<-----anche qui...
while(ix<limit)
{
char*txt = mem+next;<--non capisco come questo porti alla stringa
printf("%X -> %X : %s\n", ix, txt-mem, txt);<---cosa è txt-mem?:-?
ix +=0x0C;
next =*((short*)(mem+ix));<---come sopracitato
}
free(mem);
return0;
}
Grazie mille di tutto!^^
Ultima modifica effettuata da Roxas75 il 03/07/2011 alle 12:09
()
Newbie
Messaggi: Iscritto:
Postato alle 14:30
Domenica, 03/07/2011
Codice sorgente - presumibilmente C/C++
int limit = *((short *)(mem+0x14));
limit viene forzato per considerare il valore 20 byte (0x14) dopo l'inizio del file come puntatore ad un short il cui contenuto viene messo in limit così che limit valga la distanza dall'inizio alla stringa
Codice sorgente - presumibilmente C/C++
int next = *((short *)(mem+ix));
next vale come sopra ma all'indirizzo 0x18 dopo l'inizio del file
Codice sorgente - presumibilmente Plain Text
txt - mem
è la DISTANZA dall'inizio del file della stringa cercata
Codice sorgente - presumibilmente C/C++
next = *((short *)(mem+ix));
siccome prima viene incrementato ix di 0x0C next è il valore (puntatore) successivo (che poi viene sommato all'indirizzo iniziale del file letto mem per poter trovare l'indirizzo reale in Memoria (e non nel file) della stringa)
Mi accorgo di non essere stato molto chiaro ma non trovo altri modi per spiegarlo, scusatemi