המערך הוגדר בהקצאת זיכרון דינמית אם זה מועיל...
שפת 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, או בהתאם למשהו אחר שידוע רק בזמן ריצה.
12 שנים בתחום ה BI בתוך 5 קורסים חינמיים של כל הכלים שעבדתי איתם -
במהלך הקריירה שלי עבדתי עם כל שכבות עולם ה-Business Intelligence
מפיתוח ב-SQL Server דרך תהליכי ETL ו Data Warehouse ועד ניהול והובלת פרויקטי BI בענן
ריכזתי את כל הידע המעשי שצברתי לקורסים חינמיים ביוטיוב בדיוק כמו שעובדים BI בעולם האמיתי
אם אתם Data Analyst , BI Developer או אם אתם שואפים להיות BI System Analyst זה המקום לבנות בסיס חזק לקריירת BI
🔁 אם אתם מכירים מישהו שרוצה להיכנס לעולם ה-BI – שתפו איתו
🔗 לינק לערוץ : אקדמיית BI חינם מקצה לקצה ב YouTube
זה צריך להיות לתוכנה שמתרגמת שמות קבצים ומסדרת אותם
נעשה עם gpt
לטענתה הכל מושלם ןיציב אבל רוצה לשמוע שזה עבד מושלם בפועל
זה הקוד:
import os
import json
import shutil
import re
from pathlib import Path
from PySide6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QPushButton,
QFileDialog, QTableWidget, QTableWidgetItem, QMessageBox
)
from PySide6.QtCore import Qt
BASE_DIR = Path(__file__).parent
ARTISTS_FILE = BASE_DIR / "artists.json"
UNDO_FILE = BASE_DIR / "undo_log.json"
# ---------- Utils ----------
def load_artists():
if ARTISTS_FILE.exists():
with open(ARTISTS_FILE, "r", encoding="utf-8") as f:
return json.load(f)
return {}
def save_artists(data):
with open(ARTISTS_FILE, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def clean_name(name):
name = re.sub(r"[_\-\.]", " ", name)
name = re.sub(r"[\"\'`]", "", name)
name = re.sub(r"\s+", " ", name)
return name.strip()
def transliterate_hebrew(text):
table = {
"א": "a", "ב": "b", "ג": "g", "ד": "d", "ה": "h",
"ו": "v", "ז": "z", "ח": "ch", "ט": "t",
"י": "i", "כ": "k", "ל": "l", "מ": "m",
"נ": "n", "ס": "s", "ע": "a", "פ": "p",
"צ": "tz", "ק": "k", "ר": "r", "ש": "sh",
"ת": "t", "ך": "k", "ם": "m", "ן": "n",
"ף": "f", "ץ": "tz"
}
return "".join(table.get(c, c) for c in text)
# ---------- Main App ----------
class TuneMaster(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("TuneMaster – Safe Rename")
self.resize(800, 500)
self.layout = QVBoxLayout(self)
self.btn_select = QPushButton("בחר תיקייה")
self.btn_execute = QPushButton("בצע שינויים")
self.btn_undo = QPushButton("בטל שינויים")
self.table = QTableWidget(0, 3)
self.table.setHorizontalHeaderLabels(["מקור", "חדש", "נתיב מלא"])
self.table.horizontalHeader().setStretchLastSection(True)
self.layout.addWidget(self.btn_select)
self.layout.addWidget(self.table)
self.layout.addWidget(self.btn_execute)
self.layout.addWidget(self.btn_undo)
self.btn_select.clicked.connect(self.select_folder)
self.btn_execute.clicked.connect(self.execute)
self.btn_undo.clicked.connect(self.undo)
self.preview = []
self.artists = load_artists()
def select_folder(self):
folder = QFileDialog.getExistingDirectory(self, "בחר תיקייה")
if not folder:
return
self.preview.clear()
self.table.setRowCount(0)
for root, _, files in os.walk(folder):
for f in files:
path = Path(root) / f
stem = path.stem
ext = path.suffix
clean = clean_name(stem)
new_name = None
for he, en in self.artists.items():
if he in clean:
new_name = clean.replace(he, en)
break
if not new_name:
new_name = transliterate_hebrew(clean)
new_full = new_name + ext
if new_full != f:
self.preview.append((path, path.with_name(new_full)))
for old, new in self.preview:
row = self.table.rowCount()
self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(old.name))
self.table.setItem(row, 1, QTableWidgetItem(new.name))
self.table.setItem(row, 2, QTableWidgetItem(str(old)))
def execute(self):
if not self.preview:
return
undo_data = []
for old, new in self.preview:
if new.exists():
continue
shutil.move(str(old), str(new))
undo_data.append({"from": str(new), "to": str(old)})
with open(UNDO_FILE, "w", encoding="utf-8") as f:
json.dump(undo_data, f, indent=2, ensure_ascii=False)
QMessageBox.information(self, "בוצע", "השינויים בוצעו בהצלחה")
def undo(self):
if not UNDO_FILE.exists():
QMessageBox.warning(self, "אין", "אין מה לבטל")
return
with open(UNDO_FILE, "r", encoding="utf-8") as f:
undo_data = json.load(f)
for item in undo_data:
if Path(item["from"]).exists():
shutil.move(item["from"], item["to"])
UNDO_FILE.unlink()
QMessageBox.information(self, "בוטל", "כל השינויים בוטלו")
# ---------- Run ----------
if __name__ == "__main__":
app = QApplication([])
win = TuneMaster()
win.show()
app.exec()
שמישהו עם ראש על הכתפיים יריץ קוד שמישהו אחר כתב.
נכון?
לא הבנתי מה הבעיה שלך להריץ אותו.
תוריד vc code ותריץ
תכתוב "run python online" ותראה אופציות להרצה.
ואם אתה רוצה ממש להשקיע תוריד את התוכנות הנדרשות ותריץ עצמאית
כי הוא צריך לעבוד עם קבצים
ואיך הוא יראה שינוי בשם הקובץ?
בצורה שאני לא רוצה..
ולא איכפת לי לבדוק את הקוד אם הוא עובד
או משהו כזה.
מתרגמת את שמות הקבצים לאנגלית.
כן או לא?
יתרונות חסרונות?
אין לי מושג מה זה אומר ואשמח לכל מידע שיש לכם.
בנוסף - כמה אני אמורה להגיד ציפיות שכר, אם אני ניגשת למכרז - יש לי 3 שנים ניסיון full stack.
תודה לכם🙏
בחוזה אישי או הסכם עבודה קיבוצי? יש ועד עובדים?
משכורת גלובלית או לפי שעון נוכחות?
יש מאפיינים שונים להעסקה במשרה ממשלתית.
התנאים במשרד החנוך אינם התנאים במשרד הביטחון, למשל.
מיקור חוץ.
מאמינה שלפי שעון נוכחות.
תפקיד.
השכר הגבוה יותר מגלם את הזכויות והתנאים העודפים שיש לעובדים בקביעות באותו מקום.
בתפקידי תכנות, הנדסה, מערכות מידע - השכר במיקור חוץ יכול להיות מאוד טוב.
החסרון הבסיסי והגדול - חוץ מהשכר, אין שום תנאים נלווים שווים.
ההעסקה דרך מיקור חוץ במשרה ממשלתית - לברר בזמן הצגת הצעת השכר האם המשרה והשכר נמצאים תחת מגבלת מכסת שעות שנתיות של המעסיק.
לדוגמה האם זה לפי ממוצע 180 שעות בחודש כפול 12 חודשים, 2160 שעות שנתיות.
אם זה כך באותה משרה, ביצוע שעות נוספות אומנם מקפיץ מאוד את השכר מאוד באותו חודש, באלפי שקלים אפילו, אך השעות הנוספות אוכלות מהעוגה השנתית של מכסת השעות ויתכן שהמכסה של 2160 שעות, מהדוגמה, יאזלו חודש לפני סוף השנה או שבועיים לפני, ואז צריך לשבת בבית עד לתחילת שנת התקציב הבאה של אותו משרד ממשלתי.
בגדול, זה נחשב מקומות עבודה יציבים יותר שמשלמים פחות.
מישהו יכול לכתוב לי פה קוד לcmd (אני הולך לשמור אותו כקובץ bat בתיקייה הרלוונטית במחשב) שיהפוך את כל הסיומות של הקבצים שנמצאים בתיקייה של הסקריפט לאותיות גדולות?
למשל יש לי בתיקיה קבצים בשם
דוגמהא.rtf
דוגמהב.zip
ודוגמהג.doc
אחרי הקוד זה צריך להיראות ככה
דוגמהא.RTF
דוגמהב.ZIP
ודוגמהג.DOC
זה ממש יעזור לי
תודה רבה!
בכיוון הזה
How to convert the content of the file into uppercase or lowercase?
במקרה הזה אתה בעברית אז לא צריך לפצל את הסיומת.
רק לא כ"כ הבנתי מה שכתבת אחרי הקישור
וגם הוא מדבר שם (לפחות מה שאני הבנתי) על להמיר תוכן של קובץ, איך עושים את זה לשמות הקבצים? או שזה פשוט תוכן הקובץ של התיקיה הגדולה?
היי חברים, רציתי לעדכן שהעלתי סרטון חדש לYouTube - מדריך React Memo
Memo היא פונקציה (HOC) שמאפשרת לנו לדלג על רינדורים חוזרים של קומפוננטה כאשר הProps של הקומפוננטה לא משתנים
קישור לסרטון:
מה דעתכם?
איזה נושא תרצו את הסרטון הבא?
היי, אני צריכה ייעוץ דחוף ממי שמבין בזה.
אשמח לדבר בפרטי
זה יכול להיות יותר מידי דברים,
רצוי שתשאלי פה את השאלה על מנת שאחרים יוכלו להעזר בשאלה גם אחרים,
אבל בכל מקרה צריך שתגידי על איזה API את מדברת כי זה יכול להיות דברים שונים לחלוטין.
אבל לשאול שאלות אפשר.
יש משהו שנשקרא "אור כחול" שכל המסכים פולטי והדבר הזה יכול
להכביד על העיניים כשאנו משתמשים במכך למשך זמן רב ללא הפסקה.
ממליץ לקרוא כמה מאמרים בנושא:
שמירה על העיניים כשיושבים מול המחשב
ממליץ גם על יואב טלר. יש ל מדריך חינמי על איך יושבים בתכלס מול המחשב. בחור נחמד ומומחה!
שיהיה רק בריאות חברים !
שאלת בורות, אבל אני רוצה להבין ולא מצאתי תשובה לבד: נניח אני מפתח משחק בC++, איפה בדיוק נכנסת הגרפיקה? ראיתי שיש פקודות למשתנים לולאות וכו', איך אני מכניס תמונה שתזוז על פי התוכנה? אני מצייר אותה בקובץ נפרד ומכניס? אם כן איך ואיפה?
לא קריטי לי כל כך להיכנס לפרטים עכשיו, אבל אני נכנס לנושא אז אני רוצה לפחות להבין בגדול.
אם אתה רוצה, חיפוש ביוטיוב יוביל אותך בקלות לסידרה של בניית מכונות משחק
Write directly to screen with c++ - Stack Overflow
תקרא את התשובת שם
Module 3. Windows Graphics - Win32 apps
לא קראתי, אבל נראה שיש שם הרבה חומר.
ושוב אני שואל , למה C++?
כי זו השפה שאתה מכיר?
אולי בפייטון יהיה לך יותר קל להתחיל.?
עוד סרטונים
https://www.youtube.com/watch?v=1KD4Ae0tX0g&list=PL-K0viiuJ2RctP5nlJlqmHGeh66-GOZR_
הבנתי שבגרפיקה היא לא חזקה במיוחד, אבל הגרפיקה לא כל כך חשובה לי, יותר חשוב לי כל המשתנים והמעבר למה שרואים.
זה מה שהבנתי מאנשים שמלמדים פיתוח משחקים, אבל יש סיכוי שזה לא נכון, כמה אתה בטוח שC++ לא טובה?
אני חושב על משהו של אסטרטגיה בלי המון גרפיקה, לא יודע בדיוק מה...
באיזה שלב אתה.
אתה יודע לתכנת ?
בכמה שפות ?
כמה נסיון יש לך?
מה המטרה שלך? לכתוב משחק? או ללמוד לתכנת?
האם שמעת על unity?
שזו פלטפורמה לכתיבת משחקים, כוללת תלת מימד.
אם המטרה היא ללמוד לתכנת
אז C++ היא בהחלט מקום טוב ללמוד בו, רק מעט קשוח.
אם המטרה היא לכתוב משחק.
אז יש פלפורטמות קלות יותר. ומתאימות יותר
יתרונה של C++ היא בקרבתה לחומרה, ולכן היא מהירה יותר. ולכן מנוע שתכתוב בה, יעבוד יותר טוב.
בהצלחה.
ולא מחפש עכשיו תלת ממד.
תודה על התשובות.
למי שרוצה להתחיל ללמוד תכנות, אלו השפות הכי מומלצות, באופן כללי.
עם שלושתן אפשר לתכנת משחקים.
הייתי עושה לך .