سؤال

لدي الرمز التالي في C ++

#include <iostream>
using namespace std;

void qsort5(int a[],int n){
    int i;
    int j;
    if (n<=1)
        return;
    for (i=1;i<n;i++)
        j=0;
    if (a[i]<a[0])
        swap(++j,i,a);
    swap(0,j,a);
    qsort5(a,j);
    qsort(a+j+1,n-j-1);
}

int main()
{
    return 0;
}

void swap(int i,int j,int a[])
{
    int t=a[i];
    a[i]=a[j];
    a[j]=t;
}

انا لدي مشكلة

1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(13) : error C2780: 'void std::swap(std::basic_string<_Elem,_Traits,_Alloc> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\xstring(2203) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(13) : error C2780: 'void std::swap(std::pair<_Ty1,_Ty2> &,std::pair<_Ty1,_Ty2> &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(76) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(13) : error C2780: 'void std::swap(_Ty &,_Ty &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(16) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(14) : error C2780: 'void std::swap(std::basic_string<_Elem,_Traits,_Alloc> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\xstring(2203) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(14) : error C2780: 'void std::swap(std::pair<_Ty1,_Ty2> &,std::pair<_Ty1,_Ty2> &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(76) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(14) : error C2780: 'void std::swap(_Ty &,_Ty &)' : expects 2 arguments - 3 provided
1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(16) : see declaration of 'std::swap'
1>c:\users\dato\documents\visual studio 2008\projects\qsort5\qsort5\qsort5.cpp(16) : error C2661: 'qsort' : no overloaded function takes 2 arguments
1>Build log was saved at "file://c:\Users\dato\Documents\Visual Studio 2008\Projects\qsort5\qsort5\Debug\BuildLog.htm"

الرجاء المساعدة

هل كانت مفيدة؟

المحلول

swap هي وظيفة في std التي يجب تضمينها بواسطة <iostream>. عندما تحاول إجراء مكالمات لك swap, ، لا يمكن العثور عليه (سأشرح في لحظة) وبدلاً من ذلك ينظر إلى std::sort, ، والتي تأخذ وسيطتين (وبالتالي الخطأ الأول).

السبب في أنه لا يمكن العثور على الخاص بك swap لأنه يتم إعلانه بعد أن تم استدعاؤه. تحتاج إما إلى تحريك تعريفك swap فوق ذلك qsort5 أو تعلن ذلك:

void swap(int i,int j,int a[]);

void qsort5(int a[],int n){ 
  ...

هذا يخبر المترجم بوجود وظيفة المبادلة الخاصة بك وستستخدم ذلك عند الاتصال swap مع 3 حجج.

نصائح أخرى

عليك أن تعلن نسختك من swap قبل استخدامه. نظرًا لأن المترجم لم ير إعلانًا ، فقد استخدم الإطار الذي وجدته في std مساحة الاسم. أيضا ، لقد أخطأت qsort5 (حذف 5 في السطر الأخير من الوظيفة). مرة أخرى ، وجد المترجم وظيفة بهذا الاسم (ولكن توقيع مختلف) في std واشتكى.

يجب عليك إما نقل التعريف الكامل لـ swap إلى موقف قبل الوظيفة qsort5 أو أدخل إعلان

void swap(int i,int j,int a[]);

قبل qsort5.

لا تستخدم using namespace std;, ، هي الممارسة السيئة بشكل عام. هذا يجلب STD :: المبادلة إلى نطاق ، لذلك يلتقط برنامج التحويل البرمجي هذا المبادلة ، بدلاً من لك (نظرًا لأنك لم يتم تعريفك في كل هذه المرحلة).

انقل تعريف المبادلة الخاصة بك قبل استخدامه.

يبدو أنك تفتقد دعامة:

for (i=1;i<n;i++)
    j=0;

في الحلقة أعلاه ، j تم تعيينه على الصفر مجموعة كاملة من الأوقات. يمكن تبسيط هذا (من قبلك وسيكون من قبل المترجم) إلى:

j = 0;

وإلا هناك مجموعة مفقودة من الأقواس أو أي شيء آخر.

ما لم يكن هذا تمرينًا ، هل فكرت في استخدامه std::sort بدلا من إعادة اختراع العجلة؟ ثم يخطئ خطأك لأن ال qsort5 يمكن إزالة الوظيفة.

أنت تتوقع أن يتم استدعاء وظيفة Swap (int ، int ، int). ومع ذلك ، إذا نظرت إلى الخطأ ، فإنه يذكر "void std :: swap (...) '. هذا لأنك أنت using namespace std, ، ويتم الإعلان عن وظيفة المبادلة أدناه QSORT5.

لذلك يبحث عن وظيفة المبادلة ، ويمكن أن ترى فقط STD: SWAP. حاول وضع وظيفة المبادلة فوق QSORT5 حتى يتمكن من رؤية ذلك أيضًا.

هل ربما كنت تنوي الاتصال بـ QSORT5 في النهاية ، واستدعاء QSORT بدلاً من ذلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top