الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اختبر قدراتك في C/CPP - الحلقة الأولى

مغلق
بدأه Snack3r في 3 سبتمبر 2012 · 22 رد · 2,527 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

مرحبا بكم في هذه السلسلة البرمجية التي سنتطرق فيها إلى مجموعة اختبارات تختلف باختلاف مستوى الصعوبة و كلما تقدمنا في السلسلة كلما زادت صعوبة الأسئلة إن شاء الله.

:: الإختبار الأول ::

اكتب دالة تستقبل عدد صحيح موجب كوسيط و تعيد أصغر عدد صحيح يمكن توليده من الرقم الأصلي.

مثال :

  • المدخلات : 7351
  • المخرجات 1357

سأضع حل السؤال بعد الإنتهاء من عرض المحاولات.

3
#2

تم استقبال محاولة الأخ مصطفى.

::__________________________::

حتى تكون المحاولات ذات فائدة, سأضع الطريقة التقليدية لحل السؤال لكي أستبعدها من النقاش :

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

void Swap(char *X, int i, int j) {
    int temp;
    temp = *(X + i);
    *(X + i) = *(X + j);
    *(X + j) = temp;
}

void bubbleSort(char array[], int size) {
    for (int i = 0; i <= size - 2; i++)
        for (int j = 0; j <= size - i - 2; j++)
            if (array[j] > array[j + 1])
                Swap(array, j, j + 1);
}

int main() {
    int nombre;
    printf("N = ");
    scanf("%d", &nombre);

    int nbreDeChiffre = (int) (1 + log10(nombre));
    char *chaine = (char*) malloc(nbreDeChiffre * sizeof (char));

    sprintf(chaine, "%d", nombre);
    bubbleSort(chaine, nbreDeChiffre);
    printf("Min Number = %s\n", chaine);

    free(chaine);
    return 0;
}

بانتظار إبداعاتكم.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 4 سبتمبر 2012 في 14:59 — السبب: Mise à jour

#3

إذا سمحت لي بسؤال ..

هل استثناء الحل التقليدي ..يعني البحث عن حل آخر حتى لو كان معقداً أو طويلاً ..

وهل يعني الحل التقليدي استخدام العمليات التالية معاً في البرنامج :

1-تحويل العدد إلى مصفوفة أرقام ..

2-ترتيب المصفوفة تصاعدياً ..

3-تحويل المصفوفة المرتيبة إلى عدد ..

يعني إذا قمنا بحذف إحدى الخطوات .. فسيكون الحل غير تقليدي ... هل هذا صحيح ؟huh.gif...

أم أن الهدف هو البحث عن حل أفضل بجميع المقاييس ..؟

#4
اقتباس
هل استثناء الحل التقليدي ..يعني البحث عن حل آخر حتى لو كان معقداً أو طويلاً ..

مُعقداً : نعم

طويل : لا :)

اقتباس
وهل يعني الحل التقليدي استخدام العمليات التالية معاً في البرنامج

نعم.

اقتباس
إذا قمنا بحذف إحدى الخطوات .. فسيكون الحل غير تقليدي ... هل هذا صحيح ؟

نعم, لكن يكون الحل غير تقليدي بنسبة معينة.

اقتباس
الهدف هو البحث عن حل أفضل بجميع المقاييس ..؟

بالضبط.

النقاط التالية تُؤخذ بعين الإعتبار :

  • توافق الكود مع المعيار القياسي لــ C أو CPP
  • قصر الكود
  • سرعة التنفيذ.
  • دعم الأعداد الكبيرة.
  • دعم الأعداد السالبة.
  • عدم وجود Bugs في الكود.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 4 سبتمبر 2012 في 15:00 — السبب: Mise à jour

#5

أهلا يا أحمد

هذا ما خطر على بالي حاليا

بالنسبة للاعداد السالبة راح ما راح يكون فيه اختلاف, عن نفسي, أتخلص من الاشارة و اعكس العملية و اضرب الناتج في -1 و خلاص

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

int getMinimum(int number, int level) {
 if(level == 0)
  return number;
 long minDigitPos = 1, temp = number/10, minDigit = number-(number/10)*10;
 for(int i = 2; temp>0; i++, temp /= 10){
  if((temp-(temp/10)*10) < minDigit)
  {
   minDigit = temp-(temp/10)*10;
   minDigitPos = i;
  }
 }
 return minDigit*(int)pow((float)10,(float)level)+getMinimum(number/(int)pow((float)10,(float)minDigitPos)*(int)pow((float)10,(float)minDigitPos-1)+number-number/(int)pow((float)10,(float)minDigitPos-1)*(int)pow((float)10,(float)minDigitPos-1), level-1);
}

int main() {
 long number;
 printf("N = ");
 scanf("%d", &number);

 int level = 0;
 for(int i=number/10; i>0; i/=10)
  level ++;

 printf("Min Number = %d\n", getMinimum(number, level));

 system("pause");
 return 0;
}

تم تعديل هذه المشاركة بواسطة khatibe_30 في 3 سبتمبر 2012 في 19:27

[سبحان الله و بحمده, سبحان الله العظيم]

#6

الطريقة التقليدية بــ C++ :

#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {

    int nombre;
    cout << "N = ";
    cin >> nombre;

    ostringstream os;
    os << nombre;
    std::string str = os.str();

    int nbreDeChiffre = str.length();
    char *chaine = new char[nbreDeChiffre];

    itoa(nombre, chaine, 10);
    sort(chaine, chaine + nbreDeChiffre);

    cout << "Min Number = " << chaine << endl;
    delete []chaine;

    return 0;
}

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 4 سبتمبر 2012 في 15:00 — السبب: Mise à jour

#7

محاولات الأخ مصطفى

المحاولة الأولى, كانت تقليدية بامتياز :P

#include<cstdio>
unsigned int function(unsigned int);

int main() {
    unsigned int a;
    scanf("%u", &a);
    printf("%u\n", function(a));
}

unsigned int function(unsigned int a) {
    int i, j;
    for (i = 1, j = 0; a > i; i *= 10, j++); //Test Number Size
    if (j == 1)return a;
    unsigned int buffer, min, Size = j;
    unsigned int *A = new unsigned int[Size];
    for (i = Size - 1; i >= 0; i--) {
        A = a % 10;
        a /= 10;
    }
    for (i = 0; i < Size; i++) {
        for (min = j = i; j < Size; j++)
            if (A[j] < A[min])
                min = j;
        //Swap
        buffer = A;
        A = A[min];
        A[min] = buffer;
        //End Swap
    }
    for (a = i = 0; i < Size; i++)
        a = (a + A)*10;
    return a / 10;
}

المحاولة الثانية لم أدقق النظر فيها بعد(سأخبرك بملاحظاتي لاحقا) :

#include<cstdio>
#define Byte unsigned char
unsigned int function(unsigned int);

int main() {
    int a;
    scanf("%u", &a);
    if (a > 0)
        printf("%u\n", function(a));
    else {
        printf("Please Enter A Positive Number\n");
        main();
    }
    return 0;
}

unsigned int function(unsigned int a) {
    Byte i, j, Size;
    Byte min, min_index;
    const Byte maximum_size = 10;
    const Byte base10 = 10;
    Byte *A = new Byte[maximum_size];
    for (j = i = 0; i < maximum_size && a; i++) {
        if (a % base10)
            A[i - j] = a % base10;
        else
            j++;
        a /= base10;
    }
    Size = i - j;
    for (a = i = 0; i < Size; i++) {
        for (min = 9, j = 0; j < Size; j++)
            if (A[j] && A[j] < min) {
                min_index = j;
                min = A[j];
            }
        a = (a + min)*10;
        A[min_index] = 0; //It's Like Delete This Element
    }
    return a / 10;
}

لكن كملاحظة أولية, كلا الكودين يملك مشكلة مع الصفر (جربهما مع العدد 101 مثلا :))

#8

وعليكم السلام أخ محمد

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define  MAX 50

void viderBuffer(void);
int lire(char **,int);
void rang(char **);
void affect(char **);

int main()
{
   char *string=(char*) calloc(MAX,sizeof(char));

   puts("entrer un numbre:\n");

   if(lire(&string,MAX))
         	{
            	rang(&string);
            	affect(&string);
            	printf("\n\n==> %s\n\n",string);
            	free(string)
         	}


	else 	{
             	printf("0\n\n""error allocation\n\n"); exit(0);
         	}


	return 0;
}


void viderBuffer()
{
	int c = 0;
	while (c != '\n' && c != EOF)
    	c = fgetc(stdin);
	return;
}

int lire(char **chaine, int longueur)
{
	char *positionEntree = NULL;

	if (fgets(*chaine, longueur, stdin) != NULL)
	{
    	positionEntree = strchr(*chaine, '\n');

    	if (positionEntree != NULL)
    	{
        	*positionEntree = '\0';
    	}
    	else
    	{
        	viderBuffer();
    	}
    	return 1;
	}
	else
	{
    	viderBuffer();
    	return 0;
	}
}

void rang(char **p)

{
	int i,j=0;
   	for(i=0;(*p)!='\0';i++)
     	for(j=i;(*p)[j]!='\0';j++)
       	{
            	if((*p)>(*p)[j])
               	{
                   	(*p)^=(*p)[j];
                   	(*p)[j]^=(*p);
                   	(*p)^=(*p)[j];
               	}
       	}
	return;
}

void affect(char **p)

{
	int i,j;
     	for(j=0,i=0;(*p)!='\0';i++)
 	{
     	if((*p) <58 && (*p) >47 )
     	{
         	(*p)[j]=(*p); j++;
     	}
 	}
 	(*p)[j]='\0';
 	return;

}
/*
int* realloc_s(int **p,size_t* n)

{
	int *q=(int*) realloc(*p,*n);
	if(q!=NULL)
    	return q;
	else
   	{
    	free(p);
    	return NULL;
   	}

}*/

1346700536221.jpg

لم أنته من كتابة الدالة realloc لضيق الوقت dry.gif ولكن على العموم الكود شغال

وأتمنى التوفيق لك و لباقي الأعضاء

تم تعديل هذه المشاركة بواسطة مومو (momo) في 3 سبتمبر 2012 في 23:31

i love you mama

#9

@مصطفى, ياسين

الصفر يجب أن يظهر حتى لو تكرر عدة مرات في بداية العدد (انظرا محاولة الأخ مومو كمثال).

#10

حسنا

هذا التعديل مع اضهار الأصفار

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define p(a,b) (int)pow((float)a,b)

int getMinimum(int number, int level) {
 if(level == 0)
  return number;
 long minDigitPos = 1, temp = number/10, minDigit = number%10;
 for(int i = 2; temp>0; i++, temp /= 10){
  if(temp%10 < minDigit)
  {
   minDigit = temp%10;
   minDigitPos = i;
  }
 }
 return minDigit*p(10,level)+getMinimum(number/p(10,minDigitPos)*p(10,minDigitPos-1)+number-number/p(10,minDigitPos-1)*p(10,minDigitPos-1), level-1);
}

int main() {
 long number;
 printf("N = ");
 scanf("%d", &number);

 int level = -1, zeroNbr = 0;
 for(int i=number; i>0; i/=10){
  level ++;
  if(!(i%10))
	  zeroNbr++;
 }

 printf("Min Number = ");
 for(int i=0;i<zeroNbr;i++)
	 printf("0");
 printf("%d\n", getMinimum(number, level));

 system("pause");
 return 0;
}

[سبحان الله و بحمده, سبحان الله العظيم]

#11
khatibe_30 كتب:

حسنا

هذا التعديل مع اضهار الأصفار

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define p(a,b) (int)pow((float)a,b)

int getMinimum(int number, int level) {
 if(level == 0)
  return number;
 long minDigitPos = 1, temp = number/10, minDigit = number%10;
 for(int i = 2; temp>0; i++, temp /= 10){
  if(temp%10 < minDigit)
  {
   minDigit = temp%10;
   minDigitPos = i;
  }
 }
 return minDigit*p(10,level)+getMinimum(number/p(10,minDigitPos)*p(10,minDigitPos-1)+number-number/p(10,minDigitPos-1)*p(10,minDigitPos-1), level-1);
}

int main() {
 long number;
 printf("N = ");
 scanf("%d", &number);

 int level = -1, zeroNbr = 0;
 for(int i=number; i>0; i/=10){
  level ++;
  if(!(i%10))
  	zeroNbr++;
 }

 printf("Min Number = ");
 for(int i=0;i<zeroNbr;i++)
 	printf("0");
 printf("%d\n", getMinimum(number, level));

 system("pause");
 return 0;
}

أهلا أخ خطيب

هناك خطأ يسيط في السطر 25 حبيت أنبهك عليه لأن الساكت عن الحق شيطان أخرسlaugh.gif

C:\Documents and Settings\Administrator\My Documents\ddzdz\main.c||In function 'main':|
C:\Documents and Settings\Administrator\My Documents\ddzdz\main.c|25|warning: format '%d' expects type 'int *', but argument 2 has type 'long int *'| '/' token|
||=== Build finished: 0 errors, 1 warnings ===|

 long number;
 scanf("%d", &number);

التصحيح

 long number;
 scanf("%ld", &number);

وبالنسبة للكود الذي كتبته جربته و خرجت لي هذه الصورwacko.gif

1346711522811.jpg

1346711522902.jpg

وبالتوفيق أخي

تم تعديل هذه المشاركة بواسطة مومو (momo) في 4 سبتمبر 2012 في 01:38

i love you mama

#12

السلام عليكم

هذه أول مشاركة لي إذا سمح الأخ أحمد

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

typedef struct allocVar{
	int size;
	char * str;
}allocVar;

allocVar allocation();
void Min(allocVar number);

int main(int argc, char  * argv[])
{

	allocVar ptr;

	printf("Enter number\n\n>>> ");
	ptr = allocation();

	Min(ptr);

	printf("\n\n>>> %s\n",ptr.str);

	return 0;
}
allocVar allocation()
{
	allocVar alloc;
	char c = 0;

	alloc.size = 1;
	alloc.str = NULL;

	while((c = getchar()) != '\n')
	{
		alloc.size++;
		alloc.str =(char *) realloc(alloc.str, sizeof(char) * alloc.size);
    	if(alloc.str == NULL)
    	{
        	printf("Allocation failled in allocation function!\n");
        	exit(0);
    	}
    	alloc.str[alloc.size - 2] = c;
	}
	alloc.str[alloc.size - 1] = '\0';

	return alloc;
}

void Min(allocVar number)
{
	char  sorted_number [number.size];
	char  elements[11] = "1023456789";
	int i = 0, itr = 0, index = 0;

	for(i = 0; i < 10;i++)
	{
		for(itr = 0; itr < number.size ; itr++)
		{
			if(elements == number.str[itr])
			{
				sorted_number[index] = number.str[itr];
				index++;
			}
		}
	}
	sorted_number[number.size  - 1] = '\0';
	strcpy(number.str, sorted_number);
}

793147Sanstitre.jpg

تم تعديل هذه المشاركة بواسطة biginner2000 في 4 سبتمبر 2012 في 12:54

#13
مومو (momo) كتب:

أهلا أخ خطيب

هناك خطأ يسيط في السطر 25 حبيت أنبهك عليه لأن الساكت عن الحق شيطان أخرسlaugh.gif

C:\Documents and Settings\Administrator\My Documents\ddzdz\main.c||In function 'main':|
C:\Documents and Settings\Administrator\My Documents\ddzdz\main.c|25|warning: format '%d' expects type 'int *', but argument 2 has type 'long int *'| '/' token|
||=== Build finished: 0 errors, 1 warnings ===|

 long number;
 scanf("%d", &number);

التصحيح

 long number;
 scanf("%ld", &number);

وبالنسبة للكود الذي كتبته جربته و خرجت لي هذه الصورwacko.gif

1346711522811.jpg

1346711522902.jpg

وبالتوفيق أخي

الرقم 545454212212 لا يمكن حفظه في متغر long لهذا ما راح يقدر الكود يتعامل معه, إلا اذا تم قراءة الرقم على شكل سلسلة حرفية مثل ما عملت انت

أما الرقم الثاني فيتم ترتيبه عادي عندي

448272Sanstitre.png

[سبحان الله و بحمده, سبحان الله العظيم]

#14

هذا كود آخر باستعمال سلسلة حرفية

كل عدد يتم قراءته على حدا باستعمال getche_ و وضعه في مكانه المناسب في السلسلة

+

الكود سيقبل الأرقام فقط و يتجاهل الحروف :happy:

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main() {
 char c, strNumber[256];
 int strNumberLen, maxDigit = 1;

 printf("N = ");
 for(strNumberLen = 0, c = _getch(); c!=13; c = _getch(), strNumberLen++){
  if(c < '0' || c > '9'){
   strNumberLen--;
   continue;
  }
  putc(c, stdout);
  for(int i = 0; i < strNumberLen; i++)
   if(c < strNumber){
    for(int j = strNumberLen; j > i; j--)
     strNumber[j] = strNumber[j-1];
    strNumber = c;
    maxDigit = 0;
    break;
   }
   if(maxDigit)
    strNumber[strNumberLen] = c;
   maxDigit = 1;
 }
 strNumber[strNumberLen] = '\0';

 printf("\nMin Number = %s\n", strNumber);
 _getch();
 return 0;
}

972885Sanstitre.png

تم تعديل هذه المشاركة بواسطة khatibe_30 في 4 سبتمبر 2012 في 14:01

[سبحان الله و بحمده, سبحان الله العظيم]

#15
khatibe_30 كتب:

الرقم 545454212212 لا يمكن حفظه في متغر long لهذا ما راح يقدر الكود يتعامل معه, إلا اذا تم قراءة الرقم على شكل سلسلة حرفية مثل ما عملت انت

اسم الخطأ 0xC0000005: Violation d'accès يحدث نتيجة المحاولة للوصول إلى مكان غير مهيأ في الذاكرة

و لا أعرف هل ظهور هذا الخطأ له علاقة بتجاوزنا للمساحة المخصصة لمتغير من نوع LONG و هذا ما ظننته في البداية أم أن هناك أشياء في الكود هي التي أدت لظهوره

فمثلا عند كتابتي لعدد أكبر من العدد الأول لم يظهر عندي ذلك الخطأ و الدالة MAIN أرجعت القيمة 0 على أساس أن البنرامج يشتغل بشكل عادي

نعم هناك بعض الأخطاء التي ستظهر لك وتخبرك بأنك تجاوزت الحد المخصص ل LONG ولكن لا يتوقف البرنامج

PMQ57016.jpg

khatibe_30 كتب:

أما الرقم الثاني فيتم ترتيبه عادي عندي

جربت سلسلة من الأرقام ولم تظهر النتيجة بالشكل المطلوب

ولك أن تتأكد بنفسكdry.gif

Cld57016.jpg

بالتوفيق

i love you mama

#16
مومو (momo) كتب:

جربت سلسلة من الأرقام ولم تظهر النتيجة بالشكل المطلوب

ولك أن تتأكد بنفسكdry.gif

Cld57016.jpg

بالتوفيق

:happy:

لا أدري مابه الكومبايلر الذي تشتغل عليه أنت, طيب جرب هذا الملف التنفيذي مباشرة من عندي

http://www.mediafire.com/?mittkrbh2z7qsno

[سبحان الله و بحمده, سبحان الله العظيم]

#17
khatibe_30 كتب:

:happy:

لا أدري مابه الكومبايلر الذي تشتغل عليه أنت, طيب جرب هذا الملف التنفيذي مباشرة من عندي

http://www.mediafire...mittkrbh2z7qsno

لا أعلم من من الكومبايلرين يظهر نتائج مغلوطة هل الكومبايلر الذي أشتغل عليه أنا mellow.gifأم الذي تشتغله عليه أنت؟ happy.gif

على العموم سوف أجرب كودك في جهاز آخر و بكومبيلر آخر و سأقارن النتائج المحصل عليها حتى أعرف أي واحد منهما يظهر نتائج خاطئة؟؟

تحياتي

i love you mama

#18

محاولتي :

#include<iostream>
#include<cmath>
using namespace std;

int main() {

    long long number, s, d, z = 0, w = 1, x = 0, h = 1,m = 0, k = 0;
    unsigned long long positiveNumber;
    cout << "Entrez un nombre:";
    cin >> number;

    positiveNumber = abs(number);
    s = positiveNumber;

    while (positiveNumber > 0) {
        d = positiveNumber % 10;
        while (s > 0) {
            z = s % 10;
            if (d == z & d == m) {
                x += m*h;
                h *= 10;
                d = z;
                d = m;
            }
            if (d == z) {
                m = d;
                goto P;
            }
            if (d < z) {
                x += m*h;
                h *= 10;
                d = z;
                m = d;
            } else {
                x += z*h;
                h *= 10;
            }
P:
            s /= 10;
        }
        positiveNumber = x;
        s = x;
        h = 1;
        x = 0;
        m = 0;
        k += d*w;
        w *= 10;
    }

    if (number < 0)
        cout << "Les chiffres de " << number << " selon l'ordre croissant est "
            << -k << endl;
    else
        cout << "Les chiffres de " << number << " selon l'ordre croissant est "
            << k << endl;

    return 0;
}

لدي أيضا فكرة أخرى قد تحل مشكلة الأعداد الكبيرة :

  • نقرأ العدد باعتباره string.
  • نبحث عن الحرف الذي يملك أصغر ASCII Code في السلسلة.
  • نُخزن الحرف في مصفوفة جديدة (ستحوي فيما بعد أرقام العدد بشكل مرتب).
  • نُبادل بين خانة الحرف الأصغر و آخر خانة من المصفوفة.
  • نحذف آخر خانة من المصفوفة.
  • نكرر الخطوات السابقة حتى تنتهي المصفوفة, عندها سنحصل على مصفوفة جديدة تحوي أرقام العدد الأصلي بشكل مرتب.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 5 سبتمبر 2012 في 09:44 — السبب: Mise à jour

#19

ما رأيك بتقييم محاولتك أخي أحمد .؟wink.gif

post-256536-085909200 1346762926_thumb.p

يبدو أننا خُدعنا ..laugh.giflaugh.giflaugh.giflaugh.gifأمزح فقط ... أنا من جهتي ليس عندي مشكلة إن أردت وضع الحلقة الثانية اليوم أو غداً ... المهم أن يبقى الراوتر مفتوحا wink.gif

المرفقات
a.png
#20

@مصطفى

النص الأصلي للتمرين يقول :

اقتباس
اكتب دالة تستقبل عدد صحيح موجب كوسيط و تعيد أصغر عدد صحيح يمكن توليده من الرقم الأصلي.

و بالتالي, أنت بإدخالك -12 تكون قد خالفتَ الــ Preconditions :)

مع ذلك, يمكن للكود أن يدعم الأعداد السالبة بمجرد حذف الــ unsigned, انظر :

post-219439-040533100 1346764196_thumb.p

بالنسبة لظهور الأصفار أمام العدد, فالطريقة الثانية ستحل المشكلة, مع أن السؤال الأصلي ينص على أن العدد موجب.

المرفقات
Test.png
#21

أهلا أخ biginner2000

عندي لك ملاحظة بسيطة فيما يخص هذا السطر من الكود أتمنى أن تنتبه لفخاخ الحجز حتى لا تقع في خطأ Fuite de mémoire

biginner2000 كتب:

alloc.str =(char *) realloc(alloc.str, sizeof(char) * alloc.size);

قبل استدعاء الدالة realloc المؤشر alloc.str يؤشر على zone valide في الذاكرة

إذا سبق و استدعينا إحدى دالتي الحجز الديناميكي calloc أو malloc .

ماذا لو فشلنا في إعادة الحجز realloc؟

عندها الدالة realloc سترجع NULL كقيمة توضع داخل المؤشر alloc.str

alloc.str =NULL;

ولكن realloc لا زالت تحتفظ بال bloc mémoire المحجوز سابقا

huh.gif

هذا يعني أن أن ال bloc mémoire لم يحرر بعد ph34r.gif

وعندما يأخد المؤشر alloc.str قيمة NULL نفقد عنوان zone في الذاكرةwink.gif

وبالتالي فهذا يدل على أن هناك zone محجوزة في الذاكرة وغير مستعملة ولايمكن تحريرها لأننا فقدنا عنوانها بإعطائنا للمؤشر alloc.str القيمة NULL

لمعالجة هذه المشكلة يلزمك تهييئ مؤشرين ptr و ptr_realloc مثلا ونعطي للمؤشر ptr_realloc كقيمة (القيمة المرجعة من الدالة realloc )

ومن بعدها نقارن هذه القيمة ب NULL إذا كانت تخالفها نضع تلك القيمة داخل المؤشر ptr

انظر المثال حتى تفهم أكثر ما أقصده

void* realloc_securise (void **ptr, size_t taille)
{
 void *ptr_realloc = realloc(*ptr, taille);

 if (ptr_realloc != NULL)
 	*ptr = ptr_realloc;
/* ......... */
/* إذافشلت في إعادة الحجز ptr هنا تقوم بوضع ما يناسبك من الأوامر مثلا أن توم بتحرير*/

 return ptr_realloc;
}

وفقك الله

1

i love you mama

#22

السلام عليكم

شكرا لك أخ مومو على الملاحظة هاهي الدالة بعد التعديل

allocVar allocation()
{
	allocVar alloc;
	char c = 0;
	char * tmp_ptr = NULL;

	alloc.size = 1;

	while((c = getchar()) != '\n')
	{
		alloc.size++;

		tmp_ptr =(char *) realloc(tmp_ptr, sizeof(char) * alloc.size);

		if(tmp_ptr != NULL)
		{
    		alloc.str = tmp_ptr;
		}
        	else
   			{
        	free(alloc.str);
        	printf("Allocation fialled in allocation function!\n");
        	exit(0);

   			}
    	alloc.str[alloc.size - 2] = c;
	}
	alloc.str[alloc.size - 1] = '\0';

	return alloc;
}

وفقك الله

#23

تم اعتماد الردود المفيدة و حذف الردود الغير مفيدة حفاظا على تنسيق الموضوع.

أعتذر لجميع الإخوة.

يُغلق.

أراكم في الحلقة الثانية.

هذا الموضوع مغلق.

مواضيع مشابهة