• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Prośba o sprawdzenie, czy nie ma wycieków pamięci w programie

0 głosów
82 wizyt
pytanie zadane 9 października w C i C++ przez Deloryn Obywatel (1,840 p.)

Jeśli ktoś ma czas i chęci, proszę o sprawdzenie mojego kodu. To jest rozwiązanie jednego z problemów Project Euler w czystym C. Kilka razy wywołałem tu malloc. Nie jestem pewny, czy wszystko jest w porządku.

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

char* addTwoCharDigits(char digitOne, char digitTwo) {
  int sum = (digitOne-'0') + (digitTwo-'0');
  char *strSum = malloc(2);
  strSum[0] = (sum/10) + '0';
  strSum[1] = (sum%10) + '0';
  return strSum;
}

char* addTwoChars(char numberOne[53], char numberTwo[53]) {
  char* newNumber = malloc(53);
  char* twoDigitsSum;
  char tempDigit;
  for(int i=52; i>=0; i--) {
    twoDigitsSum = addTwoCharDigits(numberOne[i], numberTwo[i]);
    newNumber[i] = twoDigitsSum[1];
    tempDigit = twoDigitsSum[0];
    free(twoDigitsSum);
    if(tempDigit!='0') {
      for(int j=i-1; j>=0; j--) {
        twoDigitsSum = addTwoCharDigits(numberOne[j], tempDigit);
        numberOne[j] = twoDigitsSum[1];
        tempDigit = twoDigitsSum[0];
        free(twoDigitsSum);
        if(tempDigit=='0') break;
      }
    }
  }
  return newNumber;
}

void printResult(char *sumOfNumbers) {
  printf("Result (first 10 digits): ");
  bool isDigitStart = false;
  int counter = 0;
  for(int i=0; i<53; i++) {
    if(sumOfNumbers[i]!='0') isDigitStart = true;
    if(isDigitStart) {
      printf("%c", sumOfNumbers[i]);
      counter += 1;
    }
    if(counter == 10) break;
  }
  printf("\n");
}

void main() {
  char numbers[100][53];
  char number[53];
  char input[5000]="37107287533902102798797998220837590246510135740250463769376774900097126481248969700780504170182605387432498619952474105947423330951305812372661730962991942213363574161572522430563301811072406154908250230675882075393461711719803104210475137780632466768926167069662363382013637841838368417873436172675728112879812849979408065481931592621691275889832738442742289174325203219235894228767964876702721893184745144573600130643909116721685684458871160315327670386486105843025439939619828917593665686757934951621764571418565606295021572231965867550793241933316490635246274190492910143244581382266334794475817892575867718337217661963751590579239728245598838407582035653253593990084026335689488301894586282278288018119938482628201427819413994056758715117009439035398664372827112653829987240784473053190104293586865155060062958648615320752733719591914205172558297169388870771546649911559348760353292171497005693854370070576826684624621495650076471787294438377604532826541087568284431911906346940378552177792951453612327252500029607107508256381565671088525835072145876576172410976447339110607218265236877223636045174237069058518606604482076212098132878607339694128114266041808683061932846081119106155694051268969251934325451728388641918047049293215058642563049483624672216484350762017279180399446930047329563406911573244438690812579451408905770622942919710792820955037687525678773091862540744969844508330393682126183363848253301546861961243487676812975343759465158038628759287849020152168555482871720121925776695478182833757993103614740356856449095527097864797581167263201004368978425535399209318374414978068609844840309812907779179908821879532736447567559084803087086987551392711854517078544161852424320693150332599594068957565367821070749269665376763262354472106979395067965269474259770973916669376304263398708541052684708299085211399427365734116182760315001271653786073615010808570091499395125570281987460043753582903531743471732693212357815498262974255273730794953759765105305946966067683156574377167401875275889028025717332296191766687138199318110487701902712526768027607800301367868099252546340106163286652636270218540497705585629946580636237993140746255962240744869082311749777923654662572469233228109171419143028819710328859780666976089293863828502533340334413065578016127815921815005561868836468420090470230530811728164304876237919698424872550366387845831148769693215490281042402013833512446218144177347063783299490636259666498587618221225225512486764533677201869716985443124195724099139590089523100588229554825530026352078153229679624948164195386821877476085327132285723110424803456124867697064507995236377742425354112916842768655389262050249103265729672370191327572567528565324825826546309220705859652229798860272258331913126375147341994889534765745501184957014548792889848568277260777137214037988797153829820378303147352772158034814451349137322665138134829543829199918180278916522431027392251122869539409579530664052326325380441000596549391598795936352974615218550237130764225512118369380358038858490341698116222072977186158236678424689157993532961922624679571944012690438771072750481023908955235974572318970677254791506150550495392297953090112996751986188088225875314529584099251203829009407770775672113067397083047244838165338735023408456470580773088295917476714036319800818712901187549131054712658197623331044818386269515456334926366572897563400500428462801835170705278318394258821455212272512503275512160354698120058176216521282765275169129689778932238195734329339946437501907836945765883352399886755061649651847751807381688378610915273579297013376217784275219262340194239963916804498399317331273132924185707147349566916674687634660915035914677504995186714302352196288948901024233251169136196266227326746080059154747183079839286853520694694454072476841822524674417161514036427982273348055556214818971426179103425986472045168939894221798260880768528778364618279934631376775430780936333301898264209010848802521674670883215120185883543223812876952786713296124747824645386369930090493103636197638780396218407357239979422340623539380833965132740801111666627891981488087797941876876144230030984490851411606618262936828367647447792391803351109890697907148578694408955299065364044742557608365997664579509666024396409905389607120198219976047599490197230297649139826800329731560371200413779037855660850892521673093931987275027546890690370753941304265231501194809377245048795150954100921645863754710598436791786391670211874924319957006419179697775990283006991536871371193661495281130587638027841075444973307840789923115535562561142322423255033685442488917353448899115014406480203690680639606723221932041495354150312888033953605329934036800697771065056663195481234880673210146739058568557934581403627822703280826165707739483275922328459417065250945123252306082291880205877731971983945018088807242966198081119777158542502016545090413245809786882778948721859617721078384350691861554356628840622574736922845095162084960398013400172393067166682355524525280460972253503534226472524250874054075591789781264330331690";

  for(int i=0; i<100; i++) {
    number[0] = '0';
    number[1] = '0';
    number[2] = '0';
    for(int j=3; j<53; j++) {
      number[j] = input[50*i+j-3];
    }

    for(int k=0; k<53; k++) {
      numbers[i][k] = number[k];
    }
  }

  char *sumOfNumbers = malloc(53);
  for(int i=0; i<53; i++) {
    sumOfNumbers[i] = '0';
  }

  char *sumOfTwoNumbers;
  for(int i=0; i<100; i++) {
    sumOfTwoNumbers = addTwoChars(sumOfNumbers, numbers[i]);
    for(int k=0; k<53; k++) {
      sumOfNumbers[k] = sumOfTwoNumbers[k];
    }
    free(sumOfTwoNumbers);
  }

  printResult(sumOfNumbers);
  free(sumOfNumbers);
}

 

komentarz 9 października przez j23 Maniak (74,360 p.)
Pozbądź się tych alokacji pamięci. Według mnie są tutaj kompletnie zbędne.
komentarz 9 października przez Deloryn Obywatel (1,840 p.)
W takim razie - według Ciebie - jakie powinno być idealne rozwiązanie?
komentarz 9 października przez j23 Maniak (74,360 p.)

Na szybko:

char* addTwoCharDigits(char strSum[2], char digitOne, char digitTwo) {
	int sum = (digitOne-'0') + (digitTwo-'0');
	strSum[0] = (sum/10) + '0';
	strSum[1] = (sum%10) + '0';
	return strSum;
}
 
char* addTwoChars(char newNumber[53] , char numberOne[53], char numberTwo[53]) {
  char tempDigit;
  char strSum[2];

  for(int i=52; i>=0; i--) {
	addTwoCharDigits(strSum, numberOne[i], numberTwo[i]);
	newNumber[i] = strSum[1];
	tempDigit = strSum[0];

	if(tempDigit!='0') {
	  for(int j=i-1; j>=0; j--) {
		addTwoCharDigits(strSum, numberOne[j], tempDigit);
		numberOne[j] = strSum[1];
		tempDigit = strSum[0];
		if(tempDigit=='0') break;
	  }
	}
  }

 

komentarz 9 października przez Deloryn Obywatel (1,840 p.)
Rozumiem. Dziękuję za pomoc

2 odpowiedzi

0 głosów
odpowiedź 9 października przez Deloryn Obywatel (1,840 p.)
Odświeżam
0 głosów
odpowiedź 9 października przez mokrowski Szeryf (88,240 p.)
A nie umiesz sam sprawdzić? Kompilatory gcc i clang mają obecnie od tego odpowiednie narzędzia a i valgrind'a warto się nauczyć.

PS. Gratuluję pomysłu na ciąg znaków...
komentarz 9 października przez Deloryn Obywatel (1,840 p.)
Nie umiem - to jest moja poboczna zabawa, bo pracuję w zupełnie innej technologii. Ale dziękuję za informacje.

Podobne pytania

0 głosów
2 odpowiedzi 113 wizyt
+1 głos
2 odpowiedzi 233 wizyt
0 głosów
1 odpowiedź 102 wizyt
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

56,369 zapytań

101,067 odpowiedzi

208,200 komentarzy

28,040 pasjonatów

Przeglądających: 343
Pasjonatów: 14 Gości: 329

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...