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

تصحيح خطأ في كود

مغلق
بدأه cpp في 1 ديسمبر 2004 · 5 رد · 553 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السؤال:

Write a program populate which allocates from the heap any array of doubles with a default max size of 50 and populate its elements,

the standard input: populate 10 will allocate an array of 10 doubles from the heap and read a max 10 elements.

الكود:

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

#define max 50

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

{
    double *arr;
    if ( argc == 1 )
    {
    arr = malloc(sizeof(double) * max );
    printf ("Enter 50 doubles: \n");
    int i;
    for (i=0; i<max; i++){
    scanf ("%lf",arr);
     }    
    }    
    else
    {
    arr = malloc(sizeof(double) * *(argv[1]));
    printf ("Enter %s doubles: \n",argv[1]);
    int g;
    for (g=0; g<*(argv[1]); g++){
    scanf ("%lf",arr[g]);
     }    
    }
}

ما الخطأ ؟

المشكله بالـ run و ليس الـ compile

انتصف كورس البرمجه و الى الآن لم نتقن اللغه و السبب هيئة التدريس :)

فأرجو المساعده ..

#2

تعديل على ال scanf :

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

{
    double *arr;
    if ( argc == 1 )
    {
    arr = malloc(sizeof(double) * max );
    printf ("Enter 50 doubles: \n");
    int i;
    for (i=0; i<max; i++){
    scanf ("%lf",arr+i);                                     // edited
     }    
    }    
    else
    {
    arr = malloc(sizeof(double) * *(argv[1]));
    printf ("Enter %s doubles: \n",argv[1]);
    int g;
    for (g=0; g<*(argv[1]); g++){
    scanf ("%lf",arr+g);                                    // edited
     }    
    }
}

المشكله تكمن في الجزء الثاني من البرنامج و هو عند اختيار المستخدم لحجز عدد غير 50

بفرض اسم البرنامج hw4.c

عندما اكتب hw4.exe 4

فانه يستقبل 52 رقم و ليس 4

اذا كان hw4.exe 6 فانه يستقبل 54

اذا كان hw4.exe 0 فانه يستقبل 48

و هكذا ..

#3

السلام عليكم,

أولا أريد أن أقول أن argv هي عبارة عن char وهذا هو الخطء على ما يبدو.

ويجب أن نعلم أيضا أن طول الفلوت والدابل مختلفين فطول الدابل 8 هذا للمعرفة فقط.

حين نستعمل malloc من الأحسن استعمال من بعد free لكي لا نبقى محافظين على ذاكرة لا نستعملها.

وقد قمت ببعض التعديلات وهي كما يلي :

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

#define max 50


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

{
   double *arr,*temp;
   if ( argc == 1 )
   {
   arr = (double*)malloc(sizeof(double) * max );
   temp=arr;
   printf ("Enter 50 doubles: \n");
   int i;
   for (i=0; i<max; i++){
   scanf ("%1f",arr++);  
    }  
   free(temp);
   }    
   else
   {
    int number=atoi(argv[1]);
   arr = (double*)malloc(sizeof(double) * number);
   temp=arr;
   printf ("Enter %s doubles: \n",argv[1]);
   int g;
   for (g=0; g<number; g++){
    
   scanf ("%lf",arr++);                                    // edited
    }  
   free(temp);
   return 0;
   }
}

إلى اللقاء.

#4

نصيحة با أخي جرب ++C و iostream بدلا من stdio فستجد الكثير من السهولة في تنفيذ البرامج :o :o :o

#5

انته استخدمت شغلتين ماعرفهم ولا شفتهم من قبل حتى بالكتاب

arr = (double*)malloc(sizeof(double) * max );
int number=atoi(argv[1]);

بس الـ
temp = arr; ليش التيمب مادري :D

لكن زيادة الخير خيرين و مشكور على المساعده :-)

--------------------------------------------------------------------------

أخ Hazeim

حالياً أنا أدرس كورس لغة الـ C

ال c++ خلصته من زمان و ياريت ايامه ترجع :)

لو استخدمت iostream بيحذفون الهوم ورك بويهي و بيقولونلي عيده و استخدم stdio.h

#6

السلام عليكم,

زيادة temp هي فقط ليبقى تعريق arr الأول الذي سترجعه لنا الدالة malloc وهذا سنستعمله عند استدعاء الدالة free لأن arr سيتغير أثناء البرنامج وسوف نفقد قيمته الأولى.

arr = (double*)malloc(sizeof(double) * max );

هنا لم أغير شيئا على ما كتبته أنت أصلا وتبقى زيادة (double*) وهذا فقط لعمل cast على ما سترجعه لنا الدالة. فأصلا الدالة تكون على الشكل التالي

void *malloc( size_t size );

يعني سترجع لنا void* وبما أنه نحن سنهتم ب double* سنقوم بالكاست السابق حتى لا يبقى هناك أي لبس.

اقتباس
int number=atoi(argv[1]);

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

إلى اللقاء.

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

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