Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Rozwiązany]Niespodziewany wydruk komunikatu '\Program Data'

Ostatnio zmodyfikowano 2019-02-25 13:58
Autor Wiadomość
tirurir
Temat założony przez niniejszego użytkownika
[Rozwiązany]Niespodziewany wydruk komunikatu '\Program Data'
» 2019-02-25 13:58:27
Edit:
Tym razem problem rozwiązał się szybciej niż myślałem i to w zasadzie dzięki poprawnemu opisaniu go tu na forum (wpadłem na trop!). Jako, że nie da się usunąć samemu wątku (bądź nie potrafię) proszę o przeniesienie tematu jeśli jest to potrzebne.

Problem polegał na zbyt długim listowaniu zmiennej result przez co nastąpiło przepełnienie. Problem został rozwiązany.


Stara część postu:

Problem który opiszę może być prosty ale z powodu licznych podobnych fraz w google nie znalazłem rozwiązania.
Napisałem program do kompresji RLE, działa jak powinien, były w nim liczne testowe printy i czeka na dalszy rozwój ale na ten moment chciałbym pozbyć się dziwnego buga.
Czasem program wyświetla razem z wynikiem komunikat C\:Program Data bądź samo \Program Data tudzież inną ścieżkę (poza Program Data darzyło mi się raz odwołanie do katalogu Users, pewnie mogą zdażyć się także inne. Problem potrafi przytrafiać się jak i nie dla tej samej długości tekstu więc zakładam, że to nie ona jest problemem. Nie jest to też raczej pobranie wartości ze stosu, robiłem printy pustej tablicy result i raczej wyświetlałem mało czytelne wyniki.

Kompiluję w DevCpp. Testowałem kod na Online GDB - C i działał bezbłędnie choć wiem, że to nie to samo co kompilacja na PC. Jaki może być problem? Sądzę, że zamiast szukać idealnego kompilatora powinienem po prostu napisać lepszy kod.

C/C++
#include <stdio.h>
#include <string.h>
//simple file compressing program
void compress( char source[], char result[] );

int main()
{
    char buf[ 256 ]; //text buffer
    int i = 0; //iteration counter
    int length; //contains text length
   
    puts( "Enter a line of text, avoid using non letters" );
    scanf( "%s", buf );
    length = strlen( buf );
   
    char * source = malloc( sizeof( char ) *( length + 1 ) ); //allocate memory fot phrase
    strncpy( source, buf, length ); //uses strncpy the safe way
    source[ length ] = '\0'; //makes sure there is end of a string
   
    char * result = malloc( sizeof( char ) *( 2 * length + 1 ) ); //allocate memory fot phrase
   
    if( length != 0 && length != 1 ) compress( source, result ); //runs compression
   
    getchar(); //pause
    return 0;
}

void compress( char source[], char result[] )
{
    int i = 0, j = 0;
    int count = 1;
    char num = 0;
    int length = strlen( source );
   
    for( i = 0; i <( length ); i++ ) //RLE compression
    {
        if( source[ i ] == source[ i + 1 ] )
        {
            count++;
        }
        else
        {
            result[ j ] = source[ i ];
            result[ j + 1 ] = count + '0'; //tricky thing that treats count as a character ;)
            count = 1;
            j += 2;
        }
    }
   
    printf( "%s\n", result ); //TEST
    puts( result ); //TEST, same as above, just in case
   
    return;
}

Z konsoli, dwa różne użycia:


Enter a line of text, avoid using non letters
aaaabcccdeeeg
a4b1c3d1e3g1
a4b1c3d1e3g1


Enter a line of text, avoid using non letters
aaaaaabcedekt
a6b1c1e1d1e1k1t1C:\ProgramData
a6b1c1e1d1e1k1t1C:\ProgramData
Ten sam kod w Visual Studio 2017 (proces zakończył działanie z kodem 0, wykonuje się bez problemu tylko wciąż ten komunikat, tym razem już przypomina stos):

Enter a line of text, avoid using non letters
aaaaaabcedekt
a6b1c1e1d1e1k1t1═══════════řřřř
a6b1c1e1d1e1k1t1═══════════řřřř

P-174075
« 1 »
  Strona 1 z 1