Memóriahiba

Memóriahiba
2011-12-19T21:18:24+01:00
2011-12-19T21:57:16+01:00
2022-11-24T03:20:34+01:00
colin014
Sziasztok!
Írtam egy programot, amely egy sakktáblára helyez bábukat, majd ez után meg dönti a táblát és a bábuk lecsúsznak a a tábla aljára. A program minden sorra és oszlopra működik kivéve a 7-es sort és azt hiszem valami memória hiba miatt. Itt van a forráskód:
#include<stdio.h> #define N 8 void inic(char t[N][N]) { int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { t[i][j] = '.'; } } } void kiir(char t[N][N]) { int i, j; printf(" "); for (i = 0; i < N; i++) { printf(" %c", 'A' + i); } printf("\n"); for (i = 0; i < N; i++) { printf("%d|", i + 1); for (j = 0; j < N; j++) { printf("%c|", t[i][j]); } printf("\n"); } } void beolvas(char t[N][N]) { char input[64]; int sor, oszlop; while (input[0] != '*') { scanf("%s", input); oszlop = input[1] - 'A'; sor = input[2] - '0'; t[sor-1][oszlop] = input[0]; } } void dont(char t[N][N]){ int i,j; for(i=7;i>=0;i--){ for(j=7;j>=0;j--){ if((t[i][j]!='.')&&(t[i+1][j]=='.')){ t[i+1][j]=t[i][j]; t[i][j]='.'; } } } kiir(t); } int main() { char t[N][N]; int i; inic(t); beolvas(t); // kiir(t); for(i=0;i<N;i++){ printf("%d. lepes:\n",i+1); dont(t); } return 0; }
Az eclipse pedig ezt írja ki a console ablakba:

*** stack smashing detected ***: /home/colin014/workspace/dont/Debug/dont terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7f0782afc1d7]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x0)[0x7f0782afc1a0]
/home/colin014/workspace/dont/Debug/dont[0x4007c2]
/home/colin014/workspace/dont/Debug/dont[0x4008be]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xff)[0x7f0782a1ceff]
/home/colin014/workspace/dont/Debug/dont[0x400569]
======= Memory map: ========
00400000-00401000 r-xp 00000000 07:00 170929 /home/colin014/workspace/dont/Debug/dont
00600000-00601000 r--p 00000000 07:00 170929 /home/colin014/workspace/dont/Debug/dont
00601000-00602000 rw-p 00001000 07:00 170929 /home/colin014/workspace/dont/Debug/dont
0075f000-00780000 rw-p 00000000 00:00 0 [heap]
7f07827e8000-7f07827fd000 r-xp 00000000 07:00 265226 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f07827fd000-7f07829fc000 ---p 00015000 07:00 265226 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f07829fc000-7f07829fd000 r--p 00014000 07:00 265226 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f07829fd000-7f07829fe000 rw-p 00015000 07:00 265226 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f07829fe000-7f0782b88000 r-xp 00000000 07:00 265198 /lib/x86_64-linux-gnu/libc-2.13.so
7f0782b88000-7f0782d87000 ---p 0018a000 07:00 265198 /lib/x86_64-linux-gnu/libc-2.13.so
7f0782d87000-7f0782d8b000 r--p 00189000 07:00 265198 /lib/x86_64-linux-gnu/libc-2.13.so
7f0782d8b000-7f0782d8c000 rw-p 0018d000 07:00 265198 /lib/x86_64-linux-gnu/libc-2.13.so
7f0782d8c000-7f0782d92000 rw-p 00000000 00:00 0
7f0782d92000-7f0782db3000 r-xp 00000000 07:00 265185 /lib/x86_64-linux-gnu/ld-2.13.so
7f0782f8d000-7f0782f90000 rw-p 00000000 00:00 0
7f0782faf000-7f0782fb2000 rw-p 00000000 00:00 0
7f0782fb2000-7f0782fb3000 r--p 00020000 07:00 265185 /lib/x86_64-linux-gnu/ld-2.13.so
7f0782fb3000-7f0782fb5000 rw-p 00021000 07:00 265185 /lib/x86_64-linux-gnu/ld-2.13.so
7fff7a303000-7fff7a324000 rw-p 00000000 00:00 0 [stack]
7fff7a38e000-7fff7a38f000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Mutasd a teljes hozzászólást!
Kipróbáltam és nekem is csak akkor volt hiba, ha hibás bemenetet adtam meg.
Tehát hibakezelő résszel kellene a programot kiegészíteni.
Valamint
while
helyet
do-while
ciklust javaslok, mivel a while először vizsgálja hogy
(input[0] != '*')
majd csak ezután történik az
input
beolvasása.
Mutasd a teljes hozzászólást!

  • void beolvas(char t[N][N]) { char input[64]; int sor, oszlop; while (input[0] != '*') { scanf("%s", input); oszlop = input[1] - 'A'; sor = input[2] - '0'; t[sor-1][oszlop] = input[0]; } }

    Itt te az feltételezed, hogy nagybetűt adok meg, de mi van ha kicsit? Miét nem jó, ha számot olvasol be? Úgy kézenfekvőbb volna.

    Amúgy DevC-ben lefut a kód. ÉS szerintem nincs is több hibája.
    Mutasd a teljes hozzászólást!
  • Kipróbáltam és nekem is csak akkor volt hiba, ha hibás bemenetet adtam meg.
    Tehát hibakezelő résszel kellene a programot kiegészíteni.
    Valamint
    while
    helyet
    do-while
    ciklust javaslok, mivel a while először vizsgálja hogy
    (input[0] != '*')
    majd csak ezután történik az
    input
    beolvasása.
    Mutasd a teljes hozzászólást!
  • Az e heti vizsgámra készülök és a feladat feltételezi,hogy jól ,nagy betűvel adom meg a bemenetet. Kipróbáltam win7-en code::block-ban is és ott el fogadta a 7-es sort, szóval valószínüleg az eclipse-ben van a hiba. A válaszokat köszönöm.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd