שלח תשובה

זירת השאלות

238
צפיות
50
תשובות

בעיה מוזרה בקוד

,‏ 9 בפברואר, 2004

מישהו יכול להסביר לי מה לא בסדר בקוד שכתבתי? כל פעם הוא מחזיר לי משהו אחר בלי שום קשר ואני לא מצליח להבין מה לא טוב פה.


For i=0 to 9
counter=replace(counter,"" & i & "","<img src=pics/" & FolderNum & "/" & i & ".jpg>")
Next


מה שהקוד אמור לעשות זה לקבל את קאונטר (משתנה מסוג integer) ולהפוך את כל הספרות בו שבין 0-9 לתמונות. FolderNum זה מספר התיקיה שאליה הוא ניגש לקחת את התמונה. עכשיו הבעיה היא שכשאני מריץ את זה פעם אחת זה עובד כמו שצריך ואני רואה תמונות במקום מספרים, פעם אחרת אני רואה רק חלק מהתמונות וליד זה יש < או משהו דומה. בקיצור פעם אחת זה מחזיר:


<img src=pics/1/5.jpg>


ופעם אחרת זה מחזיר


<img src=pics/<img src=pics/1/1.jpg>/0.jpg>




תגיות:

50 תשובות

  1. ניר טייב הגיב:

    אם אני לא טועה
    זה כי אתה עובר על זה בלולאה וגם אתה מחליף את ה-i בכל פעם מחדש ולכן זה מחליף לך גם את החלק שמעיד על התמונה (i.jpg)

    אם אני לא טועה (שוב שים לב) אם היית עובד עם JS צד שרת (ASP עם JS)
    אז היית יכול להשתמש ב-regEXP ואפילו לא בצד שרת בצד הלקוח
    וההרפלייס בשימוש ה-regExp היה עוזר לך

    נ.ב
    בימים אלו אני מנסה ללמוד regExp ולכתוב מאמר לאתר תוך כדי (כשיש לי זמן)
    אתר גדול וחזק יש לנו כאן (ומי ש… טוב אני לא רוצה להכניס את הבעיות בתפוז כאן אז לא משנה)

  2. m_k הגיב:

    up
    יש כנראה איזה משהו לא חוקי במה שכתבתי…
    מישהו יודע?

  3. זהר פלד הגיב:

    אני חושב שצריך לראות עוד קצת קוד
    בשביל לענות על זה.

  4. m_k הגיב:

    אממממ אין לי כמעט שום דבר נוסף בקוד
    אבל הנה:


    dim conn,rs,sql
    set conn=server.CreateObject("adodb.connection")
    set rs=server.CreateObject("adodb.recordset")
    conn.Open DB
    sql="select * from counters where id=1"
    rs.Open sql,conn,3,3
    rs("counter")=Cint(rs("counter"))+1
    rs.Update
    rs.Close

    rs.Open

    Dim counter,FolderNumber
    Counter=rs("counter")
    FolderNum=rs("style")
    rs.Close
    set rs=nothing
    conn.Close
    set conn=nothing

    For i=0 to 9
    counter=replace(counter,"" & i & "","<img src=pics/" & FolderNum & "/" & i & ".jpg>")
    Next
    %>

    <%=counter%>

  5. תראה לנו מה מכיל המשתנה counter
    כשהוא עושה את ההחלפה השגויה.

  6. m_k הגיב:

    אופס
    השורה ה-Cint אולי נראה מה שמפריע אבל בקוד שלי זה Cstr

  7. m_k הגיב:

    הנה:
    החלפה שגויה:


    <img src=pics/3/7.jpg><img src=pics/3/5.jpg><img src=pics/<img src=pics/3/3.jpg>/1.jpg>

    החלפה נכונה:


    <img src=pics/3/7.jpg><img src=pics/3/5.jpg><img src=pics/3/4.jpg>

    פעם אחת זה הפלט פעם אחרת השני זה הפלט…

  8. ניר טייב הגיב:

    נסה כך…
    דבר ראשון ה-cint תכניס את הוספת האחד לתוך ה-CINT

    דבר שני במקום לולאה תעשה 10 רפלייסים שכל אחד מהם עושה רפלייס למס’ אחר נסה אולי כך זה יעבוד

  9. m_k הגיב:

    ניסיתי כבר 10 ריפלייסים
    וזה לא עזר…
    אז אין שום קשר לזה שזה בלולאה

  10. אוריקס הגיב:

    עשה כך:


    For i=0 to 9
    counter=replace(counter,"" & i & "","<img src=pics/" & FolderNum & "/" & i & ".jpg>")
    Next

    Select Case counter
    Case 1:
    counter=replace(counter,1,"<img src=pics/" & FolderNum & "/1.jpg>")
    Case 2:
    counter=replace(counter,2,"<img src=pics/" & FolderNum & "/2.jpg>")
    Case 3:
    counter=replace(counter,3,"<img src=pics/" & FolderNum & "/3.jpg>")
    Case 4:
    counter=replace(counter,4,"<img src=pics/" & FolderNum & "/4.jpg>")
    Case 5:
    counter=replace(counter,5,"<img src=pics/" & FolderNum & "/5.jpg>")
    Case 6:
    counter=replace(counter,6,"<img src=pics/" & FolderNum & "/6.jpg>")
    Case 7:
    counter=replace(counter,7,"<img src=pics/" & FolderNum & "/7.jpg>")
    Case 8:
    counter=replace(counter,8,"<img src=pics/" & FolderNum & "/8.jpg>")
    Case 9:
    counter=replace(counter,9,"<img src=pics/" & FolderNum & "/9.jpg>")
    End Select

  11. m_k הגיב:

    לעשות את ה-case
    התכוונת לעשות את ה-case בלי הלולאת for לפניו, נכון?

  12. אוריקס הגיב:

    "לא טוב" זו תשובה לא מספקת.
    מה הוא מציג? אתה מקבל שגיאה?

  13. m_k הגיב:

    אממ כן
    הרי ה-case שכתבת לי הוא על ערכים מספריים ומה שיש ב-counter זה סטרינג וזאת השגיאה, ז"א ה-type שונה בין שני הדברים….
    אבל זה לא חשוב כי שיניתי את זה ועדיין זה "לא טוב" אני מקבל את אותה תוצאה
    פעם אחת זה מציג לי תמונות ופעם שנייה לא.

  14. אוריקס הגיב:

    ועוד שאלה קטנה –
    ה FolderNum הוא גם סטרינג..?

  15. m_k הגיב:

    ה-folder num
    ה-foldernum מקבל ערך של integer אבל לא הגדרתי אותו כ-integer אלא סתם כתבתי
    dim FolderNum

  16. ניר טייב הגיב:

    ב-VBS
    אין הגדרת משתנים ומה שהם עושים כמו ב-ג’אווה ושפות תיכנות אחרות (לגבי JS לא זוכר) אתה מחליט נה יוכנס לשם בלי להגדיר קודם

  17. אוריקס הגיב:

    אולי כך
    שים את זה במקום הלולאה:


    counter=replace(counter,counter,"<img src=pics/" & FolderNum & "/" & counter & ".jpg>")

    ואם זה לא עובד אנא פרט עבור אילו ערכים זה עובד טוב ועבור אילו לא.

  18. ניר טייב הגיב:

    אוריקס אבל תחשוב ככה…
    נגיד וכתוב לו במונה 1000 אז הוא יצטרך להכין 1000 תמונות
    זה קצת מוגזם

  19. אוריקס הגיב:

    רגע…
    אתה מקבל COUNTER… אם ה Counter הוא 7 לדוגמא, אז אתה צריך להציג את תמונה 7, 8, 9?

    (כלומר ה Counter הוא מספר בין 0 ל 9).

  20. ניר טייב הגיב:

    לדעתי
    הוא צריך לעבור ל-JS ושם להשתמש ב-regEXP

  21. ניר טייב הגיב:

    לא…
    המשתנה counter שלו זה המונה עצמו שיכול להגיע עד אין גבול מסוים ה-overFlow לדעתי הוא צריך להפריד בין כל מס’ ולעשות על כל אחד בנפרד רפלייס

  22. m_k הגיב:

    מה אתה סתם זורק פה מילים
    overflow שום אובר זה קאונטר – מונה מבקרים שהספרות שלנו נעות בין 0 ל-9 ולידיעתך ב-vbscript אפשר להגדיר משתנה שהיה מטיפוס מסוים אז אל תגיד סתם שאי אפשר…
    אממ וניסיתי בלי לואלה לעבור עליהם מ-0 עד 9 שלכל אחד כתבתי שורה משלו וזה לא עזר. המספרים שבדרך כלל חוזרים עם שגיאה זה 0,1,2 אבל לפעמים גם מספרים אחרים

  23. אוריקס הגיב:

    עכשיו הכל ברור


    dim x
    for i=0 to len(counter)
    x=x & "<img src = pics/"&FolderNum&"/" &cint(mid(counter,i,1)) &".jpg><br>"
    next
    response.write x

  24. ניר טייב הגיב:

    שני דברים
    שאני אומר שהיא אפשר להגדיר טיפוס אז אי אפשר אתה יכול להגדיר בתוך המשתנה אבל לא להגדיר את המשתנה עצמו למשל כמו בג’אווה שעושים כך :

    int num1;
    char tav1;
    String str1;

    ו-overFlow אולי הספרות נעות בין 0 ל-9 אבל זה לא אומר שהמספר עצמו נע בין 0 ל-9 נגיד המס’ שלך הוא 2539 נכון יש בו 4 ספרות שנעות בין 0 ל-9 אבל המס’ עצמו כבר עבר את האלף, אך כרגע אין איתו שום בעייה רק כשהוא יגיע למס’ כזה נגיד 10000000000000 (מס’ די חלומי לאתר קטן) זה יכול לגרום ל-overFlow
    עומס יתר על המשתנה במס’ הזה יש 14 ספרות שנעות בין 0 ל-9 אבל המס’ עצמו יגרום לקריסת המשתנה

    ואני לא זורק סתם מילים!!!

  25. m_k הגיב:

    טוב כמה דברים
    דבר ראשון לא רציתי לעצבן אותך וסתם דיברתי ככה בגלל העצבים שלי שלא הולך לי אז הוצאתי את זה עליך…מצטער.
    דבר שני לא הבנתי עדיין את הקטע של ה-overflow מה מחרוזת לא יכולה להכיל יותר מ-14 תווים? או שאם זה מספר אז אני מגדיר אותו כ long integer
    ודווקא כן אפשר להגדיר משתנה מטיפוס מסוים אני זוכר שקראתי על זה פעם ב-msdn אבל לא זוכר בדיוק איך זה הולך נדמה לי ככה- dim i as integer

  26. m_k הגיב:

    אממ אתה יכול להסביר לי מה אומר הקוד
    אממ אתה יכול להסביר לי מה אומר הקוד שכתבת פה?
    הבנתי שהלולאה רצה מ-0 ועד אורכו של הקאונטר…מה הלאה?

  27. m_k הגיב:

    לא, אני מקבל שגיאה
    מה שכתבת פה זה בעצם פונקציה שכשאתה מזמן אותה אתה שולח כפרמטר פרוצדורה וזה אומר שזה לא חוקי…

  28. אוריקס הגיב:

    אין פה שום פונקציה ופרוצדורה
    א. מה השגיאה שלך?
    ב. תראה את הקוד המלא

  29. אוריקס הגיב:

    לפני כן –
    נסה כך


    dim x
    for i=1 to len(counter)
    x=x & "<img src = pics/"&FolderNum&"/" &cint(mid(counter,i,1)) &".jpg><br>"
    next
    response.write x

  30. m_k הגיב:

    מה אין פה שום פרצדורה או פונקציה
    cint זה פונקציה ו-mid זה פרוצדורה/פונקציה לא יודע מה זה בכלל אמור לעשות…
    וזה כותב שלא קראת לפונקציה בצורה חוקית

  31. m_k הגיב:

    טוב אין לי מושג איך
    אבל הקוד שכתבת כאן עובד מצוין! סוף סוף אין שגיאות
    אתה יכול להסביר לי בדיוק מה כל דבר כאן עושה כי אני לא אוהב לכתוב משהו בלי להבין מה עשיתי…

  32. אוריקס הגיב:

    תראה
    קוד כזה עובד מצויין אצלי.

    <%
    dim x
    counter="12"
    for i=1 to len(counter)
    x=x & "<img src = "&mid(counter,i,1) &".gif><br>"
    next
    response.write x
    %>

    א. תדפיס את המשתנים Counter ו FolderNum וכתוב מה הם מכילים
    ב. העתק את השגיאה המדוייקת שאתה מקבל.

  33. אוריקס הגיב:

    אני שמח שהוא עובד מצויין.
    אבל במהלך השרשור הזה שיחקנו משחק ניחושים מיותר במקום שתציג שגיאות ותעזור לי לעזור לך – סה"כ זו אחת הלולאות הכי פשוטות שכתבתי, יכלנו לחסוך את כל השרשור הזה.
    כשאני מבקש שגיאה אני יודע למה, הדיבגר הטוב ביותר הוא הדפדפן.

    דבר שני – אתה יכול להוריד את ה Cint(), אם אני לא טועה זה יעבוד לך גם בלי.

    ומה עשינו פה?
    על Mid קרא במדריך Vbs, אבל מה שבעקרון עשינו זו לולאה שתעבור "אחד אחד" על כל תו בודד בסטרינג, עבור כל מספר בטרינג היא קוראת לתמונה המתאימה.

    ולתשומת לבך: השמת Counter ב String זה פתרון קווקזי ולא מומלץ, ניתן בקלות לפרק מספר בעזרת האופרטורים ו Mod.

  34. ניר טייב הגיב:

    שני דברים
    בקשר להגדרת משתנים לא שמעתי על דבר כזה ולכן אני יותר לא אדבר על זה
    (אלא עם כן תביא לי קישור)

    דבר שני… בקשר ל-oveFlow פעם אחת מישהו שהיכרתי בפורום של איציק (itzik1.co.il) אז הצליח לפרוץ לתוך כל מיני חשבונות בברינקסטר (דרך החשבון שלו) ופרץ לשלי ולמסד שהכיל את ה-counter והכניס לתוכו יות מידי נתונים
    ואני ברוב תמימותי שמתי את ה-counter בתוך משתנה ופתאום בא עליו ה-overFlow הזה

  35. אוריקס הגיב:

    בקוד הקודם פשוט התחלתי מ0 במקום מ-1

  36. m_k הגיב:

    טוב תודה על העזרה
    אבל אם שמת לב דווקא כתבתי כאן את הקוד במלואו כולל השגיאות שהדפדפן נתן לי וכולל התוכן של קאונטר שזה בעצם כמה תגיות <img>

  37. אוריקס הגיב:

    תראה,
    זה לא לוטו. חצי שרשור בזבזנו על זה ש Counter זה בכלל סטרינג. בנוסף בקשתי ממך לא פעם שגיאה וכתבת לי את זה מילולית.

    אבל לא משנה, פעם הבאה

  38. ניר טייב הגיב:

    M_K
    מצטער שהטעתי אותך זה אפשרי פשוט אני אף לא ידעתי על זה ובשום מדריך (חוץ מה-MSDN) … אז שוב מצטער

    זה אפשרי להגדיר את סוג המשתנה ב-VBS
    בדיוק כמו שהגדרת

  39. m_k הגיב:

    יש לך איזה רעיון אז איך אני יכול
    לפתור את בעיית ה-overflow הזה? כי במקרה שלי מעל 6 ספרות יש את הבעיה הזאת-ואם אפשר אז ב-vbs כי אין לי מושג ב-js

  40. אוריקס הגיב:

    הבעייה שלך היא מבחינת המסד?
    כי זה סטרינג, לא צריכה להיות בעייה.

  41. m_k הגיב:

    לא הסתדרתי בסוף
    פשוט בקוד היה איפשהו cint אז הפכתי את זה ל-clng

שלח תשובה