اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه نویسی c

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در برنامه نویسی c

    با عرض سلام خدمت شما دوستان گرامی
    اینجانب فردی مبتدی در زمینه avr هستم ....
    برای کنترل 1 ال ای دی به وسیله 1 کلید یک جا برنامه ای به این صورت نوشته بود:
    #include <mega8.h>
    #define led PORTC
    #define swich PINB


    void main(void)
    {
    PORTC=0X00;
    DDRC=0xff;



    while (1)
    {
    led=swich;

    }
    }
    1سوال داشتم .....با وجود اینکه در قسمت CODEWIZARDE پورت C را به عنوان خروجی تعریف کرده چرا مجددا در برنامه آنرا تکرار کرده است؟؟؟من خودم یک بار این قسمت (PORTC=0X00;
    DDRC=0xffرا از برنامه پاک کردم و آنرا در برنامه پروتئوس اجرا کردم برنامه به درستی کار میکرد اما ال ای دی روشن نمیشد....با ولتمتر ولتاژ ال ای دی را چک کردم....ولتاژ خروجی کمتر از ولتاژکاری ال ای دی بود به همین دلیل روشن نمیشد..
    ولی وقتی مجدد این دوسطر را به برنامه اضافه کردم ال ای دی در برنامه پروتئوس روشن شد....آخه دلیلش چیه که ما باید دوباره بصورت دستی بنویسیم پورت C خروجی است؟؟؟مگه توی قسمت codewizarde ;که معرفی میکنیم کفایت نمیکنه؟؟؟
    خواهش میکنم هر کس سوال منو جواب میده خیلی واضح و در حد فهم من جواب بده.......ممنون از شما دوستان گرامی

    #2
    پاسخ : مشکل در برنامه نویسی c

    نوشته اصلی توسط moeinmirsharifi
    با عرض سلام خدمت شما دوستان گرامی
    اینجانب فردی مبتدی در زمینه avr هستم ....
    برای کنترل 1 ال ای دی به وسیله 1 کلید یک جا برنامه ای به این صورت نوشته بود:
    #include <mega8.h>
    #define led PORTC
    #define swich PINB


    void main(void)
    {
    PORTC=0X00;
    DDRC=0xff;



    while (1)
    {
    led=swich;

    }
    }
    1سوال داشتم .....با وجود اینکه در قسمت CODEWIZARDE پورت C را به عنوان خروجی تعریف کرده چرا مجددا در برنامه آنرا تکرار کرده است؟؟؟من خودم یک بار این قسمت (PORTC=0X00;
    DDRC=0xffرا از برنامه پاک کردم و آنرا در برنامه پروتئوس اجرا کردم برنامه به درستی کار میکرد اما ال ای دی روشن نمیشد....با ولتمتر ولتاژ ال ای دی را چک کردم....ولتاژ خروجی کمتر از ولتاژکاری ال ای دی بود به همین دلیل روشن نمیشد..
    ولی وقتی مجدد این دوسطر را به برنامه اضافه کردم ال ای دی در برنامه پروتئوس روشن شد....آخه دلیلش چیه که ما باید دوباره بصورت دستی بنویسیم پورت C خروجی است؟؟؟مگه توی قسمت codewizarde ;که معرفی میکنیم کفایت نمیکنه؟؟؟
    خواهش میکنم هر کس سوال منو جواب میده خیلی واضح و در حد فهم من جواب بده.......ممنون از شما دوستان گرامی
    سلام
    کدویزارد برای تولید کد هست که بجای اینکه زحمت بکشی کانفیگ رو بنویسی خودش برات مینویسه
    دوما برنامه کاملا نامفهموم و غیر استاندارده
    سوم این که میخوای برنامه چیکار کنه؟
    امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

    دیدگاه


      #3
      پاسخ : مشکل در برنامه نویسی c

      با سلام
      ببینید دوست من، میکرو مجوموعه از رجیستر ها داره که برای نیل به هدفی خاص باید مقادیر درست داخل ان ها نوشته شه، این هدف برنامه نویس هست، که باید داخل یک برنامه با زبانی مانند سی نوشته شه، پس کل انچه که به خورد میکرو میره، همونه که در برنامه نوشته میشه و سپس به زبان ماشین تبدیل میشه، جادویی وجود نداره، مواردی مانند ویزارد در کد ویژن فقط اومدن کار رو برای ما ساده کردن، تا بتونیم به شکل گرافیکی تنظیماتی رو انجام بدیم، اما در نهایت همه این ها باید بشه کد، که خب شده و تعجب نداره، پس این که تو ویزارد کاری انجام میدیم، بعدش کدویژن میاد و اون رو به کد تبدیل میکنه و برای ما قرار میده، صرفا یک میانبر هست و نه چیز دیگه
      The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

      دیدگاه


        #4
        پاسخ : مشکل در برنامه نویسی c

        نوشته اصلی توسط hessam2013
        با سلام
        ببینید دوست من، میکرو مجوموعه از رجیستر ها داره که برای نیل به هدفی خاص باید مقادیر درست داخل ان ها نوشته شه، این هدف برنامه نویس هست، که باید داخل یک برنامه با زبانی مانند سی نوشته شه، پس کل انچه که به خورد میکرو میره، همونه که در برنامه نوشته میشه و سپس به زبان ماشین تبدیل میشه، جادویی وجود نداره، مواردی مانند ویزارد در کد ویژن فقط اومدن کار رو برای ما ساده کردن، تا بتونیم به شکل گرافیکی تنظیماتی رو انجام بدیم، اما در نهایت همه این ها باید بشه کد، که خب شده و تعجب نداره، پس این که تو ویزارد کاری انجام میدیم، بعدش کدویژن میاد و اون رو به کد تبدیل میکنه و برای ما قرار میده، صرفا یک میانبر هست و نه چیز دیگه
        سلام
        دقیقا منظورم منم همین بود که شما بدرستی بیان کردین
        امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

        دیدگاه


          #5
          پاسخ : مشکل در برنامه نویسی c

          نوشته اصلی توسط mahdi8866
          سلام
          کدویزارد برای تولید کد هست که بجای اینکه زحمت بکشی کانفیگ رو بنویسی خودش برات مینویسه
          دوما برنامه کاملا نامفهموم و غیر استاندارده
          سوم این که میخوای برنامه چیکار کنه؟
          با عرض سلام خدمت شما دوست گرامی
          دوست عزیز این برنامه را توی کتابی به نام مجموعه پروژه های کاربردی AVR با محوریت CODEVISION نوشته بود کتابشا از اصفهان خریدم....مولف کتاب خانم مهندس هدیه ملک زاده هست...
          از نظر ظاهری که غیر استاندارد نیست.....به نظر شما کجاش غیر استاندارده؟؟؟
          این مدار کارش این هست که وقتی کلید را میزنیم (دقت کن کلید هست نه شستی PUSH) ال ای دی روشن میشه و وقتی کلید را قطع میکنیم ال ای دی خاموش میشه....فقط حتما باید کلید PULLDOWN بشه وگرنه زمانی که مدار روشن میشه اگه کلیدا قطع کنی دیگه ال ای دی خاموش نمیشه

          دیدگاه


            #6
            پاسخ : مشکل در برنامه نویسی c

            نوشته اصلی توسط moeinmirsharifi
            با عرض سلام خدمت شما دوست گرامی
            دوست عزیز این برنامه را توی کتابی به نام مجموعه پروژه های کاربردی AVR با محوریت CODEVISION نوشته بود کتابشا از اصفهان خریدم....مولف کتاب خانم مهندس هدیه ملک زاده هست...
            از نظر ظاهری که غیر استاندارد نیست.....به نظر شما کجاش غیر استاندارده؟؟؟
            این مدار کارش این هست که وقتی کلید را میزنیم (دقت کن کلید هست نه شستی PUSH) ال ای دی روشن میشه و وقتی کلید را قطع میکنیم ال ای دی خاموش میشه....فقط حتما باید کلید PULLDOWN بشه وگرنه زمانی که مدار روشن میشه اگه کلیدا قطع کنی دیگه ال ای دی خاموش نمیشه
            سلام
            اتفاقا بخاطر همین سئوال کردم برنامه میخواد چیکار کنه؟ چون نامفهوم بود برام که الان توضیح دادید
            والا در باب استاندارد هم منظورم این بود که اول حالت خروجی و ورودی بودن پورت رو مشخص میکنن بعد پورت رو مقدار دهی میکنن چیزه خاصی نبود
            [code=c]
            PORTC=0X00;
            DDRC=0xff[/code]
            امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

            دیدگاه


              #7
              پاسخ : مشکل در برنامه نویسی c

              سلام به دوستان
              یه مشکل در برنامه نویسی پیدا کردم امیدوارم راهنمایی کنید مشکل حل شه . . .

              یه تابع نوشتم که یه رشته رو بعد از فشردن اینتر از محیط ترمینال کدویژن بگیره حالا میخوام رشته ی دریافتی رو در خروجی تابع تحویل بگیرم دقت کنید در خروجی
              یعنی میخوام مقدار بازگشتی یاخود رشته باشه که بریزمش تو یه رشته دیگه یا آدرس رشته باشه که بشه به عنوان ورودی تابع ارسال رشته استفاده کرد
              دقت کنید نمیخوام مثل تابع scanf باشه که رشته ورودی میگیره . . .
              درواقع تابع هیچ ورودی نداره
              به این صورت هست :
              کد:
              [FONT=Yekan]unsigned char receivestring (void)[/FONT]{
                unsigned char string[256],b=0;
                while (1) 
                { 
                 string[b] = getchar();
                 if (string[b]==0x0D )
                   break;
                 b++;
                 if ( b>254 )
                  break;
                } 
                return *string;
              [FONT=Yekan]}[/FONT]
              این تابع بعداز فشردن کلید اینتر در محیط ترمینال رشته ی تایپ شده رو به ما تحویل میده
              میخوام یه چیزی تو این مایه ها باشه :
              کد:
              chr[]=receivestring();
              یعنی دقیقا میخوام خروجی تابع رشته ی دریافتی باشه که منتقل بشه به یه رشته دیگه . . .
              آیا این کار در زبان C امکان پذیر هست ؟
              چون هر چی من حالت های مختلف رو امتحان میکنم جواب نمیده !

              خودمم درست نفهمیدم چی گفتم ولی فکر کنم اساتید منظورم رو گرفته باشن
              آرزوی سرافرازی برای ایران عزیز . . .


              دیدگاه


                #8
                پاسخ : مشکل در برنامه نویسی c

                نوشته اصلی توسط rezamajdi نمایش پست ها
                سلام به دوستان
                یه مشکل در برنامه نویسی پیدا کردم امیدوارم راهنمایی کنید مشکل حل شه . . .

                یه تابع نوشتم که یه رشته رو بعد از فشردن اینتر از محیط ترمینال کدویژن بگیره حالا میخوام رشته ی دریافتی رو در خروجی تابع تحویل بگیرم دقت کنید در خروجی
                یعنی میخوام مقدار بازگشتی یاخود رشته باشه که بریزمش تو یه رشته دیگه یا آدرس رشته باشه که بشه به عنوان ورودی تابع ارسال رشته استفاده کرد
                دقت کنید نمیخوام مثل تابع scanf باشه که رشته ورودی میگیره . . .
                درواقع تابع هیچ ورودی نداره
                به این صورت هست :
                کد:
                [FONT=Yekan]unsigned char receivestring (void)[/FONT]{
                  unsigned char string[256],b=0;
                  while (1) 
                  { 
                   string[b] = getchar();
                   if (string[b]==0x0D )
                     break;
                   b++;
                   if ( b>254 )
                    break;
                  } 
                  return *string;
                [FONT=Yekan]}[/FONT]
                این تابع بعداز فشردن کلید اینتر در محیط ترمینال رشته ی تایپ شده رو به ما تحویل میده
                میخوام یه چیزی تو این مایه ها باشه :
                کد:
                chr[]=receivestring();
                یعنی دقیقا میخوام خروجی تابع رشته ی دریافتی باشه که منتقل بشه به یه رشته دیگه . . .
                آیا این کار در زبان C امکان پذیر هست ؟
                چون هر چی من حالت های مختلف رو امتحان میکنم جواب نمیده !

                خودمم درست نفهمیدم چی گفتم ولی فکر کنم اساتید منظورم رو گرفته باشن
                یعنی شما می خواهید یک رشته رو از کامپیوتر بگیرید ؟؟
                بعد می خواهید از رشته ای که گرفته اید جای دیگه ای استفاده کنید ؟؟
                خب اگر درست فهمیده باشم شما می آیید و دستی یه آرایه تعریف می کنید خب همون آرایه ای که تعریف کرده اید خودش آدرس خودشه
                اللهم صل علی محمد و ال محمد و عجل فرجهم
                پیامبر اکرم(ص):زکات علم نشر آن است.
                در کشور های غربی انتقال تجربیات و دانش به افراد مبتدی یک پیشرفت محسوب شده و به آن مدیریت دانش می گویند. ولی متاسفانه این فرهنگ هنوز در کشور ایران رایج نشده است !!!

                دیدگاه


                  #9
                  پاسخ : مشکل در برنامه نویسی c

                  نوشته اصلی توسط rezamajdi نمایش پست ها
                  سلام به دوستان
                  یه مشکل در برنامه نویسی پیدا کردم امیدوارم راهنمایی کنید مشکل حل شه . . .

                  میخوام یه چیزی تو این مایه ها باشه :
                  کد:
                  chr[]=receivestring();
                  یعنی دقیقا میخوام خروجی تابع رشته ی دریافتی باشه که منتقل بشه به یه رشته دیگه . . .
                  آیا این کار در زبان C امکان پذیر هست ؟
                  چون هر چی من حالت های مختلف رو امتحان میکنم جواب نمیده !

                  خودمم درست نفهمیدم چی گفتم ولی فکر کنم اساتید منظورم رو گرفته باشن
                  منم درست و حسابی نفهمیدم دقیقا منظورتون چیه!
                  در مورد زبان C، بله همه چی در این زبان ممکنه
                  اگر قصدتون برگشت دادن یه رشته توسط تابع باشه، یعنی
                  کد:
                  chr[]=receivestring();
                  در صورتی که سوالتون اینه که:
                  تابع ()receivestring خروجی یک رشته تحویل بده تا درون رشته []chr قرار بگیره
                  این کار به این شکلی که شما نوشتین در C امکان داره اما از لحاظ اصول برنامه نویسی زیاد جالب نیست!
                  شمار کار دیگه ای انجام بده:
                  به شیوه ای که مینویسم شما میتونید هر تعداد متغیر از هر نوعی رو از طریق توابع دریافت، پردازش و ارسال کنین(حتی میتونین توابع رو هم دریافت و ارسال کنین!!!)
                  امیدوارم سوال شما همین بوده باشه، و راه حل استفاده از اشاره گر ها هستش:
                  1) تعریف تابع به شکل زیر باشه


                  کد:
                  void func_get_str_and_return_str(uint8_t *str, const uint8_t strLength);
                  چند نکته:
                  این تابع کاری که میکنه شبیه به دریافت رشته و سپس روش پردازش و بعد برگشتش بده
                  اما ارسال یک رشته به صورت یک متغیر به یک تابع زیاد کار خوبی نیست و سرعت برنامه رو کند میکنه و ... اما با استفاده از اشاره گر ها سرعت افزایش پیدا میکنه و دسترسی هم بیشتر میشه.
                  2) خود تابع(در ساده ترین شکل)



                  کد:
                  
                  
                  کد:
                  void func_get_str_and_return_str(uint8_t *str, const uint8_t strLength) 
                  {
                      str[0] = 1;
                      str[1] = 2;
                      str[2] = str[0] + str[1];
                      
                      return;
                  }
                  3) نحوه استفاده از تابع:

                  کد:
                  uint8_t strSave[100];
                  func_get_str_and_return_str((uint8_t *)strSave, 100);
                  حالا بعد از خط تابع درون [2]strSave مقدار 3 قرار گرفته.
                  دلیل ارسال const uint8_t strLength درون تابع: چون معمولا نیاز داریم تا آخرین خونه رشته رو اطلاع داشته باشیم، مثلا برای زمانی که درون while قرارش دادیم و... .

                  واقعا امیدوارم سوالت همین بوده باشه!!!
                  جدیدترین ویرایش توسط mahdi89; ۱۴:۰۳ ۱۳۹۷/۰۴/۰۴.
                  ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                  شهید دکتر مصطفی چمران
                  اللهم صل علی محمد و ال محمد و عجل فرجهم
                  ; C is not for children

                  دیدگاه


                    #10
                    پاسخ : مشکل در برنامه نویسی c

                    ممنون دوست عزیز
                    اما بنده همون ابتدا عرض کردم که نمیخوام تابع ورودی بگیره . . .
                    فکر کنم این امکان وجود نداشته باشه که یک رشته مثلا 30 بایتی رو به صورت بازگشتی از تابع تحویل بگیریم یعنی return str . . . درسته ؟؟؟
                    ممکنه راهنمایی کنیدکه اگه بخوام با اشاره گرها کار کنم و تابع نمیخوام ورودی بگیره
                    میخوام دیتا رو که گرفت ریخت تو یه رشته که داخل خود تابع تعریف میشه بعد آدرس رشته رو به ما بده و ما بایت بایت رشته رو دسترسی داشته باشیم
                    امکان پذیر هست ؟؟؟
                    اگه میشه برای این دو تابع این کارو انجام بدید
                    میخوام خروجی تابع دریافت که یک رشته هست به عنوان ورودی تابع ارسال قابل قبول باشه و ایرادی نگیره
                    این تابع دریافت که سعی کردم خروجی آدرس رشته باشه . ببینید درسته ؟؟؟
                    کد:
                    [FONT=Yekan]unsigned char receivestring (void)[/FONT]{
                      unsigned char string[256],b=0;
                      while (1) 
                      { 
                       string[b] = getchar();
                       if (string[b]==0x0D )
                         break;
                       b++;
                       if ( b>254 )
                        break;
                      } 
                      return *string;
                    [FONT=Yekan]}[/FONT]
                    اینم از تابع ارسال که الان که تست میکنم خروجی تابع دریافت رو اصلا قبول نمیکنه حتی اگه ورودیش رو اشاره گر بزارم و . . . باید چیکار کرد ؟؟؟
                    کد:
                    [FONT=Yekan]void sendstring (char string[])[/FONT]{
                      unsigned char a=0;
                      for(a=0;a<256 && string[a]!='\0';a++)
                        sendchar(string[a]); 
                    [FONT=Yekan]}[/FONT]
                    آرزوی سرافرازی برای ایران عزیز . . .


                    دیدگاه


                      #11
                      پاسخ : مشکل در برنامه نویسی c

                      نوشته اصلی توسط rezamajdi نمایش پست ها
                      ممنون دوست عزیز
                      اما بنده همون ابتدا عرض کردم که نمیخوام تابع ورودی بگیره . . .
                      فکر کنم این امکان وجود نداشته باشه که یک رشته مثلا 30 بایتی رو به صورت بازگشتی از تابع تحویل بگیریم یعنی return str . . . درسته ؟؟؟
                      ممکنه راهنمایی کنیدکه اگه بخوام با اشاره گرها کار کنم و تابع نمیخوام ورودی بگیره
                      میخوام دیتا رو که گرفت ریخت تو یه رشته که داخل خود تابع تعریف میشه بعد آدرس رشته رو به ما بده و ما بایت بایت رشته رو دسترسی داشته باشیم
                      امکان پذیر هست ؟؟؟
                      اگه میشه برای این دو تابع این کارو انجام بدید
                      میخوام خروجی تابع دریافت که یک رشته هست به عنوان ورودی تابع ارسال قابل قبول باشه و ایرادی نگیره
                      این تابع دریافت که سعی کردم خروجی آدرس رشته باشه . ببینید درسته ؟؟؟
                      کد:
                      [FONT=Yekan]unsigned char receivestring (void)[/FONT]{
                        unsigned char string[256],b=0;
                        while (1) 
                        { 
                         string[b] = getchar();
                         if (string[b]==0x0D )
                           break;
                         b++;
                         if ( b>254 )
                          break;
                        } 
                        return *string;
                      [FONT=Yekan]}[/FONT]
                      اینم از تابع ارسال که الان که تست میکنم خروجی تابع دریافت رو اصلا قبول نمیکنه حتی اگه ورودیش رو اشاره گر بزارم و . . . باید چیکار کرد ؟؟؟
                      کد:
                      [FONT=Yekan]void sendstring (char string[])[/FONT]{
                        unsigned char a=0;
                        for(a=0;a<256 && string[a]!='\0';a++)
                          sendchar(string[a]); 
                      [FONT=Yekan]}[/FONT]
                      سلام
                      متغیر string که در تابع receivestring تعریف شده فقط مختص همون تابع هست و با خارج شدن از اون فضای متغیر string از بین میره و مثداری دیگه میگیره
                      برای این کار شما باید متغیر string رو به صورت سراسری (قبل از main) تعریف کنید اینجوری در توابع دیگر هم در دسترس هست

                      دیدگاه


                        #12
                        پاسخ : مشکل در برنامه نویسی c

                        نوشته اصلی توسط M3R-E نمایش پست ها
                        سلام
                        متغیر string که در تابع receivestring تعریف شده فقط مختص همون تابع هست و با خارج شدن از اون فضای متغیر string از بین میره و مثداری دیگه میگیره
                        برای این کار شما باید متغیر string رو به صورت سراسری (قبل از main) تعریف کنید اینجوری در توابع دیگر هم در دسترس هست
                        این که میفرمایید درست اما محتویات رشته که از بین نمیره
                        یعنی مقادیری که در بعضی آدرس های حافظه نوشته شده از بین نمیره
                        اما آِیا نمیشه آدرس شروع رشته رو به یه اشاره گر بدیم یعنی خروجی تابع آدرس رشته باشه که وارد یه اشاره گر میشه ؟
                        من این کارو انجام دادم یعنی خروجی ما آدرس رشته هست اما این خروجی رو نمیدونم چطور وارد تابع ارسال کنم چون تابع ارسال فقط رشته میپذیره .

                        لطفا در این خصوص راهنمایی بفرمایید
                        آرزوی سرافرازی برای ایران عزیز . . .


                        دیدگاه


                          #13
                          پاسخ : مشکل در برنامه نویسی c

                          نوشته اصلی توسط rezamajdi نمایش پست ها
                          این که میفرمایید درست اما محتویات رشته که از بین نمیره
                          با رفتن از یه تابع به تابع دیگه محتویات متغیرهایی که در تابع قبل تعریف شده ممکنه از بین بره چون حافظه ای که به متغیر در تابع تخصیص داده میشه موقت هست و با بیرون رفتن از تابع از بین میره
                          شما نتغیر رو به صورت سراسری تعریف کنی مشکلت حل میشه
                          در تابع sendstring دیگه متغیری به اسم string وجود نداره ، نه خودش نه مقدارش!! کامپایلر ارور نمیده!؟

                          دیدگاه


                            #14
                            پاسخ : مشکل در برنامه نویسی c

                            نوشته اصلی توسط M3R-E نمایش پست ها
                            با رفتن از یه تابع به تابع دیگه محتویات متغیرهایی که در تابع قبل تعریف شده ممکنه از بین بره چون حافظه ای که به متغیر در تابع تخصیص داده میشه موقت هست و با بیرون رفتن از تابع از بین میره
                            شما نتغیر رو به صورت سراسری تعریف کنی مشکلت حل میشه
                            در تابع sendstring دیگه متغیری به اسم string وجود نداره ، نه خودش نه مقدارش!! کامپایلر ارور نمیده!؟
                            درست یادم نیست اما یادمه وقتی اومدم اشاره گر رو به عنوان آرگومان واردش کنم ارور داد
                            آرزوی سرافرازی برای ایران عزیز . . .


                            دیدگاه


                              #15
                              پاسخ : مشکل در برنامه نویسی c

                              نوشته اصلی توسط rezamajdi نمایش پست ها
                              ممنون دوست عزیز
                              اما بنده همون ابتدا عرض کردم که نمیخوام تابع ورودی بگیره . . .
                              فکر کنم این امکان وجود نداشته باشه که یک رشته مثلا 30 بایتی رو به صورت بازگشتی از تابع تحویل بگیریم یعنی return str . . . درسته ؟؟؟
                              با اطلاعاتی که من دارم به صورت رشته نه، اما بصورت اشاره گر چرا میشه(در کل در زبان c ارسال یک متغیر رشته رو نداریم بلکه خود زبان c میاد آدرسش رو ارسال میکنه). که در عمل استفاده از اشاره گر ها نسبت به استفاده از خود متغیر ها اولویت بالاتری دارن و اشاره گر ها دست برنامه نویس رو خیلی بازتر میکنن.(یکی از بزرگترین قدرت های زبان c اشاره گرها هستن)

                              میخوام دیتا رو که گرفت ریخت تو یه رشته که داخل خود تابع تعریف میشه بعد آدرس رشته رو به ما بده و ما بایت بایت رشته رو دسترسی داشته باشیم
                              امکان پذیر هست ؟؟؟
                              بله
                              وقتی رشته درون تابع تعریف بشه اونوقت میشه یک متغیر محلی که با خروج از تابع اون متغیر عملا از بین میره به غیر از اینکه اجازه ندید.(برای اینکه متغیر تعریف شده درون یک تابع بعد از خروج از تابع از بین نره باید اون رو static تعریف کنین)

                              اگه میشه برای این دو تابع این کارو انجام بدید
                              میخوام خروجی تابع دریافت که یک رشته هست به عنوان ورودی تابع ارسال قابل قبول باشه و ایرادی نگیره
                              این تابع دریافت که سعی کردم خروجی آدرس رشته باشه . ببینید درسته ؟؟؟
                              داداش سرم شلوغه!!!
                              تغییر کدت کاره خاصی نمیخواد
                              یک نمونه کد واست میزارم اگر با کمک این نمونه کدها کارت راه نیفته بروی چشم، کدهات رو تغییر میدم

                              char * myFunction(void);


                              int main()
                              {
                              char* str;
                              str = myFunction();
                              printf("%s", str);


                              printf("\nNeed Exit?: (y/n)\n");
                              while (1)
                              {
                              if (getchar() == 'n')
                              {
                              break;
                              }
                              }
                              return 0;
                              }


                              char* myFunction()
                              {
                              static char array[10] = "salalm";

                              return array;
                              }
                              این کد رو هم توی ویژوال استودیو 2017 برای ++C تست کردم هم توی CodeBloacks برای C تست کردم هر دو درست کار کرد.
                              نکته این کدهارو برای کنسول نوشتم و دستور printf نمیدونم توی محیطی که شما کد میزنی چه معنی میده اگر دستورات کنسول رو هم ازش حذف کنیم تنها کدهای زیر میمونه که توی تمام محیط های C ثابته:

                              char * myFunction(void);


                              int main()
                              {
                              char* str;
                              str = myFunction();

                              return 0;
                              }


                              char* myFunction()
                              {
                              static char array[10] = "salalm";


                              array[6] = ' ';
                              array[7] = ':';
                              array[8] = ')';
                              array[9] = '\0';


                              return array;
                              }

                              اگر جاییش سوالی داشتی من در خدمتم
                              توی تابع main با رشته str خیلی راحت مثل اینکه یک متغیر رشته معمولی تعریف کردی میتونی کار کنی، مثلا:

                              str[1] = 'A';
                              str[2] = 32;
                              if (str[0] == 's')
                              {
                              .
                              .
                              .
                              }



                              دلیل: ادغام دو پست برای جلوگیری از اسپم

                              نوشته اصلی توسط M3R-E نمایش پست ها
                              سلام
                              متغیر string که در تابع receivestring تعریف شده فقط مختص همون تابع هست و با خارج شدن از اون فضای متغیر string از بین میره و مثداری دیگه میگیره
                              برای این کار شما باید متغیر string رو به صورت سراسری (قبل از main) تعریف کنید اینجوری در توابع دیگر هم در دسترس هست
                              توی برنامه نویسی تا جای ممکن سعی میشه تا از تعریف متغیر عمومی استفاده نشه، چندین دلیل داره که برای برنامه های حجیم تقریبا اجباریه
                              راه حلش تعریف کردن اون متغیر از نوع static هستش، اینجوری بعد از خروج از تابع دیگه به اون متغیر دسترسی ندارین اما آدرس اون متغیر و محتویات متغیر و حافظه اشغال شده توسط اون متغیر از بین نمیره.
                              ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                              شهید دکتر مصطفی چمران
                              اللهم صل علی محمد و ال محمد و عجل فرجهم
                              ; C is not for children

                              دیدگاه

                              لطفا صبر کنید...
                              X