Avatar
j.zejdl
Člen
Avatar
j.zejdl:

Čau, nechce se mi spustit program od kámoše. Ve škole děláme v Micr. Visual studiu.Přitom v code blocks to jede kámošovi. Neví někdo co s tím?

#include <stdio.h>
#include <stdlib.h>

/*
1) Vytvořte tyto funkce:
  a) Funkce, která naplní pole sudými čísly
  b) Funkci, která rozdělí pole na 2 části a zamění je.
  Vstupními parametry bude identifikátor pole, číslo řádku, podle kterého se pole rozdělí.
  Výstupním parametrem bude int, nenulová hodnota bude značit příznak chyby
  (požadavek na prohození pole podle řádku mimo platný rozměr atd.). Operace ve funkci provádějte pomocí
  ukazatelů.
  c) Funkci, která uloží pole do souboru v textové formě
  d) Funkci, která načte toto pole z tohoto souboru
  e) Hlavní funkce (main) :
  · načte požadovaný rozměr a alokuje paměť podle tohoto požadavku.
  · Vypíše pole na obrazovku
  · Vytvoří a vypíše součet jednotlivých řádků
  · Uloží upravené pole do souboru na disketu
  · Načte toto pole a znovu jej vypíše
  · Před ukončením programu uvolní všechnu alokovanou paměť
  · Název souboru na disketě se zadává jako parametr při spouštění programu
*/
void sudaCisla (int *pole, int velikost);
int prohozeniPole(int *pole, int velikost,int pivot);
int poleDoSouboru(int *pole, int velikost,char *cesta);
int poleZeSouboru(int *pole, char *cesta,int size);
int main (int argc, char **argv)
{
        int *pole;
        int radek;
        int *rPole;
        char *pomPole=NULL;
        int velikost;
        int res,i,j;
        int sum=0;

        /*NACTENI POZADOVANEHO ROZMERU A ALOKACE PAMETI*/
        printf("Zadejte velikost pole:\n");
        res=scanf("%d",&velikost);
        if(res && velikost >0)
                pole=(int*)malloc(velikost*sizeof(*pole));
        else {
          printf("Zadali jste neplatny rozmer pole.\n");
          return 1;
        }
        /*NACTENI POZADOVANEHO ROZMERU A ALOKACE PAMETI*/

        sudaCisla(pole,velikost);


        printf("Zadejte cislo radku, podle ktereho chcete pole prohodit:\n");
        res=scanf("%d",&radek);
        if(res&&radek>0)
          res=prohozeniPole(pole,velikost,radek);
        else
          res=1;//nepovedlo se nacist spravne radek, podle ktereho se ma pole prohodit
        if(res)
          printf("Doslo k chybe pri prohazovani casti pole. Pole je navraceno v puvodnim tvaru.\n");

        /*VYPIS POLE*/
        for(i=0;i<velikost;i++)
        {
                printf("%d\n",pole[i]);
        }
        /*VYPIS POLE*/


        /*VYPIS SOUCTU POLE*/
        for(i=0;i<velikost;i++)
        {
                sum+=pole[i];
        }
        printf("Soucet pole je %d\n",sum);
        /*VYPIS SOUCTU POLE*/

        if(argc==2)
          res=poleDoSouboru(pole,velikost,argv[1]);//ULOZI POLE DO SOUBORU
        else
        {
          pomPole=(char*)malloc(180*sizeof(*pomPole));
          printf("Zadali jste spatne cestu, prosim zadejte, kam si prejete soubor ulozit:\n");
          scanf("%s",pomPole);
          res=poleDoSouboru(pole,velikost,pomPole);
        }

        if (res)
        {
           printf("Chyba pri zapisovani pole do souboru, zkontrolujte prosim zda mate prava zapisovat tam, kam jste zadali.");
           free(pole);//UVOLNENI PAMETI
           pole=NULL;//NASTAVENI UKAZATELE NA NULL ... KDYBY BYL PROBLEM VYHODI SEG. FAULT
           if(pomPole)
           {
             free(pomPole);
             pomPole=NULL;
           }
           return 1; //nema cenu dal nacitat nejake pole, ktere sme ani neulozili
        }

        free(pole);//UVOLNENI PAMETI
        pole=NULL;//NASTAVENI UKAZATELE NA NULL ... KDYBY BYL PROBLEM VYHODI SEG. FAULT

        /*lze pouzit samozrejme i malloc, ale zrovna v tomhle pripade mi prijde calloc vyhodnejsi, uz jenom proto,
         * ze pokud by nahodou doslo k prideleni stejneho kusu pameti, ktery byl puvodne, budou tam stejny data,
         * i kdyby doslo k chybe pri cteni pole, takhle tam budou puvodne nuly a je potreba je prepsat nactenymi hodnotami
         */
        rPole=(int*)calloc(velikost,sizeof(*rPole));
        if(pomPole==NULL)
          res=poleZeSouboru(rPole,argv[1],i);
        else
        {
          res=poleZeSouboru(rPole,pomPole,i);
          free(pomPole);
          pomPole=NULL;
        }

        if (res)//dost nepravdepodobne, ze by selhalo cteni, kdyz zapis projde, ale pro jistotu zkontrolujeme
        {
           printf("Chyba pri cteni pole ze souboru, zkontrolujte prosim zda mate prava cist z umisteni, kam jste pole ulozili.");
           free(rPole);//UVOLNENI PAMETI
           rPole=NULL;//NASTAVENI UKAZATELE NA NULL ... KDYBY BYL PROBLEM VYHODI SEG. FAULT
           return 1; //nema cenu vypisovat, kdyz mame chybu pri nacitani
        }

        for(j=0;j<i;j++)
        {
          printf("%d\n",rPole[j]);
        }
        free(rPole);
        rPole=NULL;

        /*NACTENI POLE ZE SOUBORU A JEHO VYPSANI*/
        return 0;
}

void sudaCisla (int *pole, int velikost)
{
        int i;
        for (i=0;i<velikost;i++)
        {
                pole[i]=2*(i+1); // nepredpokladam nulu jako sude cislo, jinak misto i+1 pouze i
        }
}

int prohozeniPole(int *pole, int velikost,int pivot)
{
        int *tmpPole;
        int i;
        int *pntr,*pntr2;
        if(pivot<velikost)
        {
          tmpPole=(int*)malloc(velikost*sizeof(*tmpPole));
          pntr=tmpPole;//nastaveni ukazatele pntr na zacatek pole tmpPole
          pntr2=pole+pivot;//nastaveni rovnou na hodnotu odkud se ma cist
          for(i=pivot;i<velikost;i++)
          {
              *pntr=*pntr2;
              pntr++;
              pntr2++;
          }
          pntr2=pole;//a nastaveni pntr2 na zacatek vstupniho pole, odkud nacteme jeste ten zacatek
          for(i=0;i<pivot;i++)
          {
              *pntr=*pntr2;
              pntr++;
              pntr2++;
          }
          for(i=0;i<velikost;i++)
          {
            pole[i]=tmpPole[i];
          }
          free(tmpPole);
          tmpPole=NULL;
          return 0;
        }
        return 1;
}

int poleDoSouboru(int *pole, int velikost,char *cesta)
{
  int i;
  FILE *f=fopen(cesta,"w");
  if(f==NULL)
    return 1;
  for(i=0;i<velikost;i++)
  {
    fprintf(f,"%d\n",pole[i]);
  }
  fclose(f);
  return 0;
}

int poleZeSouboru(int *pole, char *cesta,int size)
{
  int count=0;
  int a;

  FILE *f=fopen(cesta,"r");
  if(f==NULL)
    return 1;
  while((a=fscanf(f,"%d",&pole[count]))!=EOF)
  {
    count++;
    if(size==count)
      break; //zapise jen tolik kolik se vejde do zadaneho pole
    continue;
  }
  fclose(f);
  return 0;
}
 
Odpovědět 13.1.2014 14:58
Avatar
MrPabloz
Člen
Avatar
MrPabloz:

Co takhle napsat co se vypíše? nějaké chybové hlášení a tak?

Nahoru Odpovědět 13.1.2014 15:13
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Odpovídá na j.zejdl
Libor Šimo (libcosenior):

Myslím, že vo VS musíš vvytvoriť nový projekt a tam to skopírovat.
Samotný file tam nespustíš, len projekt.

Editováno 13.1.2014 15:24
Nahoru Odpovědět 13.1.2014 15:20
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Adam "Nero" Chudomel:

ve Visual studiu by jsi měl mít "našeptávač" který nejen že radí při psaní kodu ale i ukazuje chyby, pak by určitě stálo za to zjistit jaké máte verze případně se pokusit přepsat chyby co Visual Studio ukazuje

Nahoru Odpovědět  -1 13.1.2014 15:22
Nihil est, aut totum licet consistere
Avatar
Adam "Nero" Chudomel:

BTW. pokud ti poslal celý projekt tak by jsi tam měl mít složku "Debug" ve které je rovnou exe

Nahoru Odpovědět 13.1.2014 15:40
Nihil est, aut totum licet consistere
Avatar
j.zejdl
Člen
Avatar
j.zejdl:

Ono to právě neukazuje nic, nechce se to přeložit vůbec. Micr.Visual 2013.

 
Nahoru Odpovědět 13.1.2014 16:05
Avatar
Odpovídá na j.zejdl
Michal Žůrek (misaz):

A jakým způsobem to překládáš?

Nahoru Odpovědět 13.1.2014 16:16
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na j.zejdl
Libor Šimo (libcosenior):

Toto som našiel : http://www.youtube.com/watch?…
Vyskúľal som to a funguje to ako má. Len nedávaj nikde žiadny podtržník, ako je to tam. Proste len urob ukázané nastavenie a projekt spusti.

Nahoru Odpovědět 13.1.2014 16:49
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
j.zejdl
Člen
Avatar
j.zejdl:

Díky

 
Nahoru Odpovědět 13.1.2014 16:51
Avatar
Odpovídá na j.zejdl
Libor Šimo (libcosenior):

Ten podtržník som myslel v kóde, nie v nastavovaní, tam sú tiež podtržníky.
Vo VS som vytvoril empty project a doňho som dal ten kamošov súbor.

Nahoru Odpovědět 13.1.2014 16:54
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.