আমি "সি 99 মোডের বাইরে লুপের প্রাথমিক ঘোষণার জন্য" জিসিসির ত্রুটিটি কীভাবে ঠিক করব?


116

আমি 3n + 1 সমস্যা সমাধানের চেষ্টা করছি এবং আমার কাছে এমন forলুপ রয়েছে যা দেখতে দেখতে:

for(int i = low; i <= high; ++i)
        {
                res = runalg(i);
                if (res > highestres)
                {
                        highestres = res;
                }

        }

দুর্ভাগ্যক্রমে আমি এই ত্রুটিটি পেয়েছি যখন আমি জিসিসি দিয়ে সংকলনের চেষ্টা করেছি:

3np1.c: 15: ত্রুটি: 'জন্য' C99 মোডের বাইরে লুপ প্রাথমিক ঘোষণাপত্র ব্যবহৃত হয়েছে

আমি জানি না C99 মোডটি কী। কোন ধারনা?

উত্তর:


148

আমি ঘোষণা করার চেষ্টা করব i লুপের বাইরে !

3n + 1 :-) সমাধান করার জন্য শুভকামনা

এখানে একটি উদাহরণ:

#include <stdio.h>

int main() {

   int i;

   /* for loop execution */
   for (i = 10; i < 20; i++) {
       printf("i: %d\n", i);
   }   

   return 0;
}

সি loops জন্য আরও পড়ুন এখানে


তাহলে আপনি পরিবর্তে লুপ ব্যবহার করবেন না কেন?
এরিক ডব্লিউ

3
@ এরিকডাব্লু আপনার প্রশ্নটি খুব খারাপ
ব্যবহারকারী 25

118

একটি সংকলক সুইচ রয়েছে যা সি 99 মোড সক্ষম করে , যা অন্যান্য জিনিসের মধ্যে লুপের ভিতরে ভেরিয়েবল ঘোষণার অনুমতি দেয়। এটি চালু করতে সংকলক সুইচটি ব্যবহার করুন-std=c99

বা @ অয়েস্টারডি যেমন বলেছে, লুপের বাইরে ভেরিয়েবল ঘোষণা করুন।


7
আসলে -std = gnu99 সম্ভবত আরও আকাঙ্ক্ষিত যেহেতু আপনি এখনও জিসিসি এক্সটেনশানগুলি পান (জিসিসি ডিফল্ট -std = gnu89 এ, তবে এটি পরবর্তী কয়েকটি সংস্করণে কিছুটা সময় gnu99 এ পরিবর্তন হবে)
স্পড 86

3
@ স্পুড 86 you: আপনি জিসিসি এক্সটেনশানগুলি সক্ষম করতে চান কিনা তার উপর নির্ভর করে। আপনার লক্ষ্যটি যদি জিসিসি ব্যতীত অন্য সংকলকদের কাছে বহনযোগ্য এমন কোড লিখতে হয় তবে এগুলি অক্ষম করা সহায়ক।
কিথ থম্পসন

21

কোডব্লকগুলিতে সি 99 মোডে স্যুইচ করতে , পরবর্তী পদক্ষেপগুলি অনুসরণ করুন:

প্রোজেক্ট / বিল্ড অপশনগুলি ক্লিক করুন , তারপরে ট্যাবে সংকলক সেটিংস উপ -ট্যাব নির্বাচন করে অন্যান্য বিকল্পগুলি , এবং -std=c99পাঠ্য অঞ্চলে রাখুন এবং ওকে ক্লিক করুন ।

এটি আপনার কম্পাইলারের জন্য সি 99 মোডটি চালু করবে ।

আমি আশা করি এটি কারও সাহায্য করবে!


এটি অন্য সংকলক বিকল্পগুলির অধীনে কোডব্লকগুলিকে 16.1 তে সহায়তা করেছে ! যদিও আমি -std=gnu99উপরের কিছু উত্তরে চিত্রিত হিসাবে ব্যবহার করেছি !
অঙ্কুর শাহ

কিন্তু এই অস্থায়ীভাবে সাহায্য! প্রতিবার কোড সংকলন করার সময় আমাকে এটি করতে হবে! ... :(
অঙ্কুর শাহ

না, তোমার নেই! এটি অবশ্যই প্রতিটি নতুন প্রকল্পের জন্য একবার করা উচিত।
akelec

14

আমি এই ত্রুটি পেয়েছি।

for (int i=0;i<10;i++) { ..

C89 / C90 স্ট্যান্ডার্ডে বৈধ নয়। ওয়েস্টারডি যেমন বলেছে, আপনার এটি করা দরকার:

int i;
for (i=0;i<10;i++) { ..

আপনার মূল কোডটি C99 ভাষা এবং পরবর্তী মানেরগুলিতে অনুমোদিত।


3
জিসিসির জন্য, এটি একটি "-std = c99" ফেলে দিন। অতিরিক্ত বৈশিষ্ট্যগুলির জন্য ইমরানের উত্তর দেখুন।
ম্যাট জে

হ্যাঁ, এটি বৈধ সি; এটি ঠিক বৈধ নয় C89 / C90।
কিথ থম্পসন

@ কিথথম্পসন: পরিষ্কার করা হয়েছে।
ব্লারগবার্ড

আপনি এখনও বলছেন এটি বৈধ সি নয়, কেবলমাত্র একটি যোগ্যতার সাথে। এটি পুরোপুরি বৈধ সি; ১৯৯৯ স্ট্যান্ডার্ডটি ছাড়িয়ে যায় এবং ১৯৯০ এর স্ট্যান্ডার্ডটি প্রতিস্থাপন করে এবং ২০১১ সালের স্ট্যান্ডার্ডটি ছাড়িয়ে যায় এবং ১৯৯৯ স্ট্যান্ডার্ডটি প্রতিস্থাপন করে (যদিও আপনি উত্তরটি মূলত পোস্ট করেছিলেন তবে এর পরে উপস্থিত ছিল না)।
কিথ থম্পসন

@ কিথথম্পসন ঠিক আছে, আমি যা ভেবেছিলাম তা সেটাই নয়। আপনি কি "C89 / C90 স্ট্যান্ডার্ডে বৈধ নয়" বিবেচনা করবেন?
ব্লারগবার্ড

13

ব্লগারবার্ড :

সি 99 এ নতুন বৈশিষ্ট্য

  • ইনলাইন ফাংশন
  • ভেরিয়েবলের ঘোষণাপত্র আর ফাইল স্কোপ বা যৌগিক বিবৃতি শুরুর মধ্যে সীমাবদ্ধ থাকে না
  • দীর্ঘ দীর্ঘ অন্তর্গত, extendedচ্ছিক বর্ধিত পূর্ণসংখ্যার ধরণ, একটি স্পষ্টভাবে বুলিয়ান ডেটা টাইপ এবং জটিল সংখ্যার প্রতিনিধিত্ব করার জন্য একটি জটিল প্রকার সহ বেশ কয়েকটি নতুন ডেটা প্রকার
  • পরিবর্তনশীল দৈর্ঘ্যের অ্যারে
  • বিসিপিএল বা সি ++ তে, // দিয়ে শুরু হওয়া এক-লাইন মন্তব্যের জন্য সমর্থন
  • স্নিপ্রিন্টফের মতো নতুন গ্রন্থাগার ফাংশন
  • নতুন শিরোনাম ফাইল, যেমন stdbool.h এবং ইন্টি টাইপস
  • টাইপ-জেনেরিক গণিত ফাংশন (tgmath.h)
  • আইইইই ভাসমান পয়েন্টের জন্য উন্নত সমর্থন
  • মনোনীত প্রারম্ভিক
  • যৌগিক আক্ষরিক
  • ভেরিয়েডিক ম্যাক্রোস (ভেরিয়েবল আরটিটির ম্যাক্রো) জন্য সমর্থন
  • আরও আক্রমণাত্মক কোড অপ্টিমাইজেশনের অনুমতি দেওয়ার জন্য যোগ্যতা সীমাবদ্ধ করুন

http://en.wikipedia.org/wiki/C99

সি 99 এর একটি ভ্রমণ


6

আপনি যদি সি পরিবর্তন করে সংকলন করেন

for (int i=0;i<10;i++) { ..

প্রতি

int i;
for (i=0;i<10;i++) { ..

আপনি সি 99 স্যুইচ সেট দিয়েও সংকলন করতে পারেন। সংকলন লাইনে -std = c99 রাখুন:

gcc -std=c99 foo.c -o foo

REF: http://cplusplus.syntaxerferences.info/index.php?title= 'for__lop_initial_declaration_used_outside_C99_mode


3

বাহ্যিক উত্স থেকে যে কোনও স্বয়ংক্রিয় বিল্ড ইউটিলিটি যেমন মেইক ব্যবহার করে সেগুলি কোড সংকলন করার চেষ্টা করে, স্পষ্টত জিসিসি সংকলন কলগুলি ট্র্যাক না করে আপনি পরিবেশ পরিবর্তনশীল সেট করতে পারেন। কমান্ড প্রম্পটে প্রবেশ করুন বা .bashrc (অথবা ম্যাকের উপর .bash_profile) দিন:

export CFLAGS="-std=c99"

নোট করুন যে আপনি যদি সি ++ সংকলনের সাথে একই জাতীয় দৃশ্যে চলে যান তবে C ++ 11 প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন: অনুরূপ সমাধান প্রযোজ্য:

export CXXFLAGS="-std=c++11"

1

আমারও একই সমস্যা ছিল এবং এটি কাজ করে আপনাকে কেবল iলুপের বাইরের ঘোষণা করতে হবে :

int i;

for(i = low; i <= high; ++i)

{
        res = runalg(i);
        if (res > highestres)
        {
                highestres = res;
        }

}

1

জিহেন স্টাম্বুলি ওপি প্রশ্নের উত্তর সরাসরি দিয়েছেন ... প্রশ্ন ছিল; কেন

for(int i = low; i <= high; ++i)
{
    res = runalg(i);
    if (res > highestres)
    {
        highestres = res;
    }
}

ত্রুটি উত্পাদন;

3np1.c:15: error: 'for' loop initial declaration used outside C99 mode

যার জন্য উত্তর

for(int i = low...

হতে হবে

int i;
for (i=low...

1

কোড :: ব্লক 16.01 এ C99 মোড সক্ষম করুন

  • সেটিংসে যান -> সংকলক ...
  • ইন কম্পাইলার পতাকা বিভাগে কম্পাইলার সেটিংস ট্যাব নির্বাচন করুন চেকবক্সটি ' আছে 1999 আইএসও সি ল্যাঙ্গুয়েজ মান অনুসরণ জিসিসি [-std = C99] '

0

কিউটি-ক্রিয়েটারের জন্য: কেবল * .pro ফাইলের সাথে পরবর্তী লাইন যুক্ত করুন ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.