המערך הוגדר בהקצאת זיכרון דינמית אם זה מועיל...
שפת c++
לא ניתן להעלים שורה מאמצע מערך או להוסיף.
צריך ליצור מערך חדש עם/ ללא השורה.
(1) מחק את השורה שאתה רוצה.
(2) הזז אותה לסוף כך:
א. הזז את כל הpointers של השורות שורה אחת אחורה.
ב. בסוף ישאר לך מקום אחד פנוי/nullptr.
דוגמא:
const int sizex = 5;
char** myarr = new char*[sizex];
printf("My array pointers:\n");
for (int i = 0; i < sizex; ++i)
{
printf("myarr[%d] = 0x%p\n", i, &myarr[i]);
}
printf("\nMy array pointers data:\n");
for (int i = 0; i < sizex; ++i)
{
printf("myarr[%d] = 0x%p\n", i, myarr[i]);
}
printf("\nAlloc lines and put data:");
const int sizey = 3;
for (int i = 0; i < sizex; ++i)
{
myarr[i] = new char[sizey];
for (int j = 0; j < sizey; ++j)
{
myarr[i][j] = i;
}
}
printf("\nMy array pointers data:\n");
for (int i = 0; i < sizex; ++i)
{
printf("myarr[%d] = 0x%p\n", i, myarr[i]);
}
printf("\nDelete line 3:\n");
const int deleteIndex = 3;
delete[] myarr[deleteIndex];
myarr[deleteIndex] = nullptr;
for (int i = 0; i < sizex; ++i)
{
printf("myarr[%d] = 0x%p\n", i, myarr[i]);
}
printf("\nMove the last lines back:\n");
for (int i = deleteIndex; i < sizex - 1; ++i)
{
myarr[i] = myarr[i+1];
}
myarr[sizex - 1] = nullptr;
for (int i = 0; i < sizex; ++i)
{
printf("myarr[%d] = 0x%p\n", i, myarr[i]);
}
for (int i = 0; i < sizex - 1; ++i)
{
for (int j = 0; j < sizey; ++j)
{
printf("%d ", (int)myarr[i][j]);
}
printf("\n");
}
delete[] myarr;
myarr = nullptr;
אבל אם זה בתחילת המערך זה יוצא פחות יעיל מאשר ליצור מערך חדש.
אשמח להסבר.
לענ"ד, זה לא משנה בתחילה/אמצע/סוף.
בשביל לעשות את מה שאתה אמרת, צריך גם ליצור מערך חדש וגם להעתיק אותו.
בפתרון שלי בסה"כ מעתיקים את המצביעים. שזה בסך הכל
לעומת
ובעיקר שהקצאת זיכרון היא פעולה יקרה.
delete[] myarr[deleteIndex];
for (int i = deleteIndex; i < sizex - 1; ++i)
{
myarr[i] = myarr[i+1];
}
myarr[sizex - 1] = nullptr;
טעות שלי
אם הגדרת/ה אותו כמערך שמצביע על מערכים
זה משחק של מצביעים.
אם הגדרתה אותו כמערך דו ממדי,
אז בזיכרון הוא מוכנס כבלוק אחד ארוך
מחולק לפי הגודל של המערך הפנימי.
לכן אפשר להריץ מצביע מהשורה הבאה ולהעתיק כל תא בזיכרון
שורה למעלה, וככה פשוט לדרוס את כל המידע שיש
בשורה שרוצים למחוק.
ולא צריך לייצר מערך חדש ולהעתיק הכל לתוכו.
מקווה שזה מובן.
זה טריק ידוע מ-c.
בכל מקרה צריך לתקן את ההקצעות עם realloc.
הבעייה הגדולה מתחילה כשיש לך עוד מקומות שמצביעים לתוך המערך
שאז אי אפשר להזיז את שאר השורות במערך.
ואז הייתי שומר עוד טבלה שאומרת איזה שורות פעילות ואיזה לא.
במקום להתעסק במחיקות.
רק הערה קטנה:
realloc אפשר לעשות על זיכרון שהוקצאה בעזרת בmalloc/calloc ולא בעזרת new. [וכדאי להיות מודעים להבדלים...
realloc() and not yet freed with a call to free or realloc. Otherwise, the results are undefined."
בהקשר של ההקצאות:
חשוב לזכור שפעולות הקצאה/מחיקה, הן פעולות יקרות.
(בעיקר כשהן רבות, והביצועים חשובים...)
וכאשר אפשר להקצאות הכל מראש, ולמחוק בסוף הכל. עדיף.
ובדוגמא שלך:
אם חשובים לך הביצועים, אתה יכול להקצאות את מערך המצביעים בגודל המקסימלי שתצטרך.
[בהנחה שיש כזה...]
וכאשר אתה רוצה למחוק שורה, תעביר אותה לסוף.
[וכן תוכל למחזר את הזיכרון שלה לשימוש בdata שונה (בתנאי שהיא בגודל שאתה צריך...)]
ובסופו של דבר תמחק את כל מה שנשאר לך.
(אא"כ כמות הdata הזו של השורות המחוקות תתפוס לך יותר מדי זיכרון ותשחרר בכל זאת)
וכן כמו שL אמר אולי כדאי לך להשתמש במבנה נתונים שכבר הוגדר כמו בvector.
בהצלחה
כי מה שאתה אומר קבוע לגמרי, ויש מקרים שרוצים לקבוע את זה מראש בהתאם לקובץ config, או בהתאם למשהו אחר שידוע רק בזמן ריצה.
הם ציפו שהקלטים יועברו לשרת, או לדף HTML אחר?
כי לעבור לדף html אחר באותה תיקיה עם קלטים זה אמור להיות מאוד פשוט -
a.html
<html> <head> </head> <body> <form action="b.html"> <input name="text"> <input type="submit" value="submit"> </form> </body> </html>
b.html
<html>
<body onload="document.querySelector('#text').innerText = location.search.split('=')[1]">
<h1 id="text"></h1>
</body>
</html>
שאלה על תיכנות universal app, בC#פרח.כתוםיש בC# פקודה שגורמת ל"גריד" לאתחל את עצמו למצב ההתחלתי (מבחינה גרפית)?
בניתי משחק, ואני רוצה לעשות אופציה של כפתור "משחק חדש", ובלי לעבור אובייקט אובייקט כדי לאתחל אותו.
יש דרך לעשות את זה בפקודה אחת?
יצרתי אותו לא בעזרת הקוד (ואולי פה הבעיה שלי...), אלא בעזרת הסרגל הויזואלי, ורק את ה"איוונטים" הגדרתי בקוד.
אז יש לי שם לכל דבר, אבל להתחיל לאתחל דבר דבר בקוד זה נראה לי מסורבל (ויש הרבה אלמנטים)
סביוןלהגדיר את כל הגרפיקה כמשהו אחד שאפשר פשוט לאתחל אותו.
לא מוצאת בקוד איפה הם מוגדרים, ואני לא כ"כ יודעת איך להגדיר אותם בקוד בלי הסרגל הויזואלי...
בינתיים לחיצה על משחק חדש מייצרת משחק חדש תקין לגמרי מבחינת התיפעול - מלבד הגרפיקה שהיא שאריות מהמשחק הקודם...

מישהו יודע איך נקראת הפקודה שגורמת לכל הviews להיות מאותחלים?
או לחלופין - איך בקוד אני מגדירה את הgrid כדי לקרוא לו מחדש בכל תחילת משחק?
יש לנו, נגיד, App.xaml ומאחוריו יש App.xaml.cs שהוא הקובץ שבו את מכניסה את הלוגיקה שלך. ב-App.xaml.cs מוגדר -
sealed partial class App : Application
{
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
}
שימי לב - זהו partial class, זאת אומרת שרק חלק מהקוד נמצא כאן, שאר הקוד נמצא בקובץ אחר.
הקובץ הזה לא נמצא ב-solution explorer, אבל F12 על InitializeComponent או Shift+F12 על App יביאו אותנו לקובץ בשם App.g.i.cs.
קריאה ל-InitializeComponent היא בעייתית מכיוון שחלק הקוד ששם צריך לרוץ רק פעם אחת.
את יכולה אבל להבין מה קורה שם ולהעתיק את קטעי הקוד הרלונטיים.
את יכולה לפתוח תהליך אם שפותח תהליך בן שהוא המשחק,
שכשאשר הבן לוחץ על new game יגמר המשחק הקודם
ויפתח משחק חדש.
את המידע מסוף המשחק הראשון אפשר לשמור בקובץ טקסט אם רוצים.
עוד אפשרות היא פשוט להריץ את התוכנה (זה במקרה שכבר יש לך קובץ ריצה).
(פה צריך לבדוק אם אפשר לסגור את התהליך הקורא ליפני שייגמר תהליך הבן או לא
וקצת ניסוים).
גילוי נאות אין לי מושג איך לתכנת ב-#c לכן הבאתי עקרון ולא קוד ממש.
זה API מיושן פיירפוקס כבר לא תומכים בו אבל כרום עדיין כן.
בכרום זה מאוד נחמד כי יש לך גם קונסול שאפשר לעבוד מולו.
יוצרים DB בצורה הבאה -
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
לאחר מכן התחביר הוא של sql סטנדרטי, ניתן באמצעות קוד js-
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');
tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');
tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {
var len = results.rows.length;
for (var i = 0; i < len; i++){
console.log(results.rows.item(i).log);
}
}, null);
)};
ניתן גם לעבוד בקונסול של כרום -
devtools => applications => websql => mydb
שם יש קונסול שניתן לכתוב בו בתחביר סטנדרטי של sqllite.
נוצר לך קובץ של sqllite שאפשר לעבוד איתו גם מחוץ לכרום, הקובץ נמצא בנתיב -
%localappdata%\Google\Chrome\User Data\Default\databases\
ושם בתיקיה עם שם האתר שבו הרצת את הקוד.
SQL Server Express, MYSQL ברלציונים.
בלא רלציונים - mongoDb.
יש עוד הרבה, אבל אלה כלים מאוד נפוצים וחינמיים.
איזה סוג תוכנה אפשר לעשות ב vs שתוכל לעשות פעולה ישר כשנלחץ מקש ולא רק אחרי האנטר כמו קונסול?
אני כותב ב-python ומבסס את האלגוריתמים שלי על tensorflow (בעיקר).
הבעיה היא שיש לי המון data והאלגוריתמים שלי דורשים המון פעולות.
הבנתי שאפשר להריץ את תכניות על ה-gpu ולחסוך המון זמן.
יש למישהו מושג איך עושים את זה? איך אני גורם ל-python לרוץ על ה-gpu? האם זה אפשרי בכל מחשב?
אני לא מאוד מבין בזה, אבל נראה לי שכך:
בשביל להריץ משהו שיעבוד על הgpu אתה צריך:
(1) לכתוב משהו שפונה ישירות לgpu. (בעזרת ספריות כמו CUDA/OpenCL)
(2) להשתמש בספריות שיש להם אופטימזציות\משתמשות בעצמן בgpu. (נראה לי שזה המקרה שלך...)
[(3) לכתוב רגיל ולשים flag לקומפיילר שיעשה לך אופטימזציות לgpu.
-לא מכיר דבר כזה, אבל במחינת הרעיון בfeatures של cpu אני מכיר דברים כאלו.]
"האם אפשרי בכל מחשב?"
(1) אתה צריך שבמחשב שלך יהיה gpu כמובן.
א. בהרבה מהמעבדים של intel היום יש gpu מובנה.
ב. אם יש לך כרטיס מסך של nvidia אתה יכול להשתמש במשהו שמשתמש בCUDA.
(2) כנראה שתצטרך להתקין ספריות שתומכות בכך מול הgpu הקיים. OpenCL/CUDA.
בסופו של דבר נראה לי שכדאי שתחפש:
"tensorflow python gpu"
https://www.tensorflow.org/versions/master/how_tos/using_gpu/
https://www.tensorflow.org/get_started/os_setup
בהצלחה
ואשמח לדעת כשתצליח מה עשית בסוף...

בדוקומנטציה שלהם זה נראה די פשוט איך להגדיר לתכנית לרוץ על ה-gpu במקום על ה-cpu...
למחשב שלי בעבודה יש gpu במעבד (בדקתי דרך הטרמינל) אבל לא של nvidia.
לגבי חיפושים: אני כותב כאן כסוג של צעד ייאוש. קראתי באתר את כל מה שקשור בזה ועברתי דפים על גבי דפים בפורומים ושלל אתרים. (בעיקר stackpverflow ו-github אבל גם אחרים).
מעניין אותי אם אני יכול למצוא מישהו שעשה את זה ויכול לחלוק איתי מתובנותיו...
אני אמשיף לעבוד על זה ואם תהיה הצלחה, אעדכן.
תודה ושבת שלום.
In order to build or run TensorFlow with GPU support, both NVIDIA's Cuda Toolkit (>= 7.0) and cuDNN (>= v3) need to be installed.
TensorFlow GPU support requires having a GPU card with NVidia Compute Capability (>= 3.0). Supported cards include but are not limited to:
https://www.tensorflow.org/get_started/os_setup#optional-install-cuda-gpus-on-linux
אבל זה נראה שבכל מקרה לכל הOS כיום זה נכון.
אלא אם כן אפשר להריץ cuda בלי gpu של NVIDIA, כמו בעזרת OpenCL...
כאן זה נראה שלא:
אבל אולי בעזרת זה, זה יעבוד:
[לא בדקתי את זה לעומק...]
עוד נקודה חשובה לבדיקה [גם אם משהו כמו "cuda on cl"] יעבוד, עדיין צריך לדאוג שגם cuDNN [שגם הוא של NVIDIA] יעבוד...
בהצלחה
מה זה "החלון שמראה את התהליך"? איזה תהליך?
עקרונית חלונות שקשורים בדבאג נמצאים ב-Debug=>Windows, שאר החלונות נמצאים ב-View.
הרצה ב-F10 זהה לחלוטין להרצה ב-F5 חוץ מהעובדה שהקוד נעצר בשורה הראשונה של התוכנית עד להמשך ההרצה.
הבנתי שהאפליקציות של הפלאפוני מקשים הן jar, ג'אווה.
אם אפשר ייעוץ איזה סביבת פיתוח כדאי ואיפה אני יכול ללמוד קצת את הנושא (הכוונה למשהו חינמי כמובן...).
חוץ מזה, אני חייב להתקין ג'אווה על המחשב אם אני רוצה לעשות את זה?
תודה רבה, בכל אופן!
אני הצלחתי להשיג ג'אווה וגם קומפיילר (netbeans) פורטייבל, נייד.
מה שאני לא מצליח זה להתקין עליו תוסף של ג'אווה מי (JAVA ME) שזה בעצם סביבת פיתוח למכשירים ניידים.
אם מישהו יכול לעזור לי אשמח מאד.
כשאני מנסה להתקין את התוסף הוא אומר לי שחסרים לי הרבה תוספים אחרים בכל מיני גרסאות שלא הצלחתי למצוא...
תודה!
ערב טוב
שאלה קטנה באקסל, אולי מישהו ידע לעזור
יש לי נתונים שהגיעו מקובץ CSV והדבקתי אותם באקסל.
בין השאר אחד הנתונים זה תאריך, הבעיה היא שהתאריך לא מגיע כמספר סריאלי (הדרך שבה אקסל 'מבין' תאריכים, אלא כתאריך ממש). מה שאומר שכשאני מנסה להפעיל עליו פונקציות של תאריך הוא נותן שגיאה.
למישהו יש רעיון איך אפשר לפתור את הבעיה.
לצורך הפישוט אסביר שבעצם יש לי כמות גדולה מאוד של תאריך שכתובים כתאריך ממש - כפי שכותבים את התאריך בוורד ולא כפי שאקסל מתרגם אותו. ואני צריך לעשות עליהם אנליזה.
תודה רבה
לבנתיים הראו לי דרכים עוקפות ועוקפות עוקפות, אבל טוב שיש גם פיתרון אמיתי
זה עדיף כי זה יתרגם אותם סימולטנית...
בטעות נכנסתיאחרונהערב טוב לכולם.
אני מחפש תוכנה "מיכה 8".
מישהו יודע איפה אפשר למצוא את תוכנה "מיכה 8"?
תודה לכולם
זה אה"נ
?
למה (בסי שארפ) false||true נותן true
מישהו נחמד יכול להסביר?
בשפה פשוטה?
אז לfalse הוא באמת נותן false אבל בגלל שזה or הוא עובר לחלק השני (שאם הוא יהיה נכון אז כל הביטוי נכון כי בor מספיק שרק צד אחד אמת כדי שכל הביטוי יהיה אמת) שהוא true ולכן כל הביטוי הוא true ולכן הוא מחזיר בסה"כ true
מקווה שזה מובן
בהצלחה!
מספיק שרק אחד מהמשתנים יהיה true כדי שכל הביטוי יהיה true
די חשוב....
לאובייקט List או LinkedList?
לגבי
חוני המעגל פינותהאובייקט LinkedList הוא רשימה אמיתית -
האיבר הבסיסי שלו הוא LinkedListNode שמכיל הצבעה לאיבר הקודם, הבא, לרשימה ולערך.
באובייקט LinkedList נשמרים הצבעות לאיבר הראשון ברשימה והאחרון ברשימה.
כפועל יוצא - הוספת/ מחיקת איבר בהתחלה או בסוף O(1). הוספת/מחיקת איבר במקום n יהיה O(N) (הזמן שלוקח לעבור על כל האיברים עד למקום הרצוי).
גישה לאיבר במקום n תהיה ב-O(n).
האובייקט List, לעומת זאת, הוא פשוט עטיפה למערך.
יש לו מאפיין בשם Capacity (קיבולת), שאומר מה הגודל כרגע של המערך.
הגודל ההתחלתי של המערך הוא 0 (אלא אם הגדרת אחרת ב-ctor.)
כשמוסיפים לו איבר פעם ראשונה הוא יוצר מערך בגודל 4. ומאז כל פעם שהוא עובר את הגודל הזה הוא יוצר מערך בגודל כפול ומעביר לשם את האיברים הקיימים.
מכל זה יוצא שב-List - הוספת איבר בסוף רשימה של n פריטים יהיה במקרה הטוב (כשיש מקום במערך הנוכחי) O(1) ובמקרה הרע O(n). למעשה זה נחשב O(1) כי המקרה הרע הוא נדיר יחסית עבור מיליון הוספות 20 פעם.
הוספת/ הסרת איבר במקום n ברשימה בגודל m תהיה במקרה הטוב O(m-n) (הזזה של כל המערך שאחרי המקום הזה), ובמקרה הרע O(n) (יצירת מערך מחדש). (נחשב O(n)).
היתרון הגדול במערך הוא בגישה באמצע המערך שהסיבוכיות שלה הוא O(1). עוד יתרון הוא שהוא חסכוני יותר מבחינת זכרון - הוא מקצה רק מקום לערכים עצמם, לעומת LinkedList שיוצר אובייקט עם 3 מצביעים מלבד הערך. ועוד יתרון - הוא מקצה את הזיכרון מראש ולא בזמן ההוספה של איבר חדש.
מכל זה יוצר ש-List יותר מהיר גם בהוספה (כי הוא לא יוצר איבר חדש עם 4 מאפיינים כל פעם. והמקרים שהוא צריך להקצות רשימה חדשה הם נדירים יחסית- עבור מיליון הוספות 20 פעם). וגם בגישה לאמצע הרשימה.
לגישה במיקום מסוים ברשימה יש משמעות מאוד גדולה בהרבה מאוד אלגוריתמים (מיון מהיר, לדוגמה).
הסיבה היחידה (שאני חושב עליה) להשתמש ב-LinkedList היא כשצריך הרבה פעמים להוסיף או להסיר איברים באמצע הרשימה.
עוד סיבה אפשרית היא רשימה גדולה של struct שתופס הרבה מקום בזיכרון. אבל שלא ידוע מראש כמה אברים יהיו ברשימה. במקרה כזה מערך יכול לתפוס הרבה מקום מיותר בזיכרון לעומת LinkedList.
אם כתבתי טכני מדי - אני יכול להסביר יותר...
זה תלוי במימוש של האפליקציה. יש עוד פיתרונות בתלות בסביבה ובשימושים שלה.
מה גודל האובייקט?
רעיונות יצירתיים נשמור לפרוייקטים אמיתיים.
(לא זוכר שהשתמשתי אי פעם ב-LinkedList ב-20 השנים שלי במקצוע).

אז בהחלט חפרתי יותר מדי.
ב"ה
תודה!
לא ידעתי את זה.
יש לך עוד חומרים כאלו?
כתבתי את זה מידע כללי.
אם יש ביקוש אני יכול לעשות פוסט כזה מדי פעם
אני רוצה ליצור לולאה כלשהי כדי שאם הוכנס ערך לא מוכר לcupSize משפט הswitch יתחיל מהתחלה
איך עושים את זה?
Console.Write("Enter cup size (big / medium / small): ");
string cupSize = Console.ReadLine();
int price = 0;
switch (cupSize)
{
case "big":
price = 15;
break;
case "medium":
price = 13;
break;
case "small":
price = 9;
break;
default:
Console.WriteLine("Invalid cup size! please try egain");
break;
}
if (price != 0)
{
Console.WriteLine("The coffee price is " + price);
}
bool isReadValidValue = false;
while(!isReadValidValue )
{
Console.Write("Enter cup size (big / medium / small): ");
string cupSize = Console.ReadLine();
isReadValidValue =true;
int price = 0;
switch (cupSize)
{
case "big":
price = 15;
break;
case "medium":
price = 13;
break;
case "small":
price = 9;
break;
default:
Console.WriteLine("Invalid cup size! please try egain");
isReadValidValue =false;
break;
}
}
if (price != 0)
{
Console.WriteLine("The coffee price is " + price);
}
// untested
var prices= new Dictionary<string, int>()
{
{ "big", 15},
{ "small",9},
{ "medium", 13}
};
string cupSize = Console.ReadLine();
if (!prices.ContainsKey(cupSize) throw new Exception("cupSize is wrong") // or while, or what you want;
console.WriteLine("Cofee price is : " + prices[cupSize]);
בשלב הבא אתה צריך לשים שם לולאה (כמו שהציעו מעליי) או כל וריאציה אחרת (אני כמעט ולא עובד בקונסול).
העניין הוא שהרבה יותר פשוט לנהל את זה ככה, במיוחד אם הרשימה הזו מהגיעה מבסיס נתונים או קובץ XML או מה שלא יהיה....
בקצרהאחרונה